From 98056f6ed7f49fed17eb1d57b56b6a0afefa35e1 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 10 Oct 2022 18:52:35 -0400 Subject: [PATCH] Move logging context map into `log.py` module --- tractor/_state.py | 18 ------------------ tractor/log.py | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/tractor/_state.py b/tractor/_state.py index c0c957b..d8aa2f2 100644 --- a/tractor/_state.py +++ b/tractor/_state.py @@ -52,24 +52,6 @@ _conc_name_getters = { } -class ActorContextInfo(Mapping): - "Dyanmic lookup for local actor and task names" - _context_keys = ('task', 'actor') - - def __len__(self): - return len(self._context_keys) - - def __iter__(self): - return iter(self._context_keys) - - def __getitem__(self, key: str) -> str: - try: - return _conc_name_getters[key]().name # type: ignore - except RuntimeError: - # no local actor/task context initialized yet - return f'no {key} context' - - def is_main_process() -> bool: """Bool determining if this actor is running in the top-most process. """ diff --git a/tractor/log.py b/tractor/log.py index ba3e29c..4273c9b 100644 --- a/tractor/log.py +++ b/tractor/log.py @@ -18,12 +18,14 @@ Log like a forester! """ +from collections.abc import Mapping import sys import logging import colorlog # type: ignore -from typing import Optional -from ._state import ActorContextInfo +import trio + +from ._state import current_actor _proj_name: str = 'tractor' @@ -36,7 +38,8 @@ LOG_FORMAT = ( # "{bold_white}{log_color}{asctime}{reset}" "{log_color}{asctime}{reset}" " {bold_white}{thin_white}({reset}" - "{thin_white}{actor}, {process}, {task}){reset}{bold_white}{thin_white})" + "{thin_white}{actor_name}[{actor_uid}], " + "{process}, {task}){reset}{bold_white}{thin_white})" " {reset}{log_color}[{reset}{bold_log_color}{levelname}{reset}{log_color}]" " {log_color}{name}" " {thin_white}{filename}{log_color}:{reset}{thin_white}{lineno}{log_color}" @@ -136,6 +139,37 @@ class StackLevelAdapter(logging.LoggerAdapter): ) +_conc_name_getters = { + 'task': lambda: trio.lowlevel.current_task().name, + 'actor': lambda: current_actor(), + 'actor_name': lambda: current_actor().name, + 'actor_uid': lambda: current_actor().uid[1][:6], +} + + +class ActorContextInfo(Mapping): + "Dyanmic lookup for local actor and task names" + _context_keys = ( + 'task', + 'actor', + 'actor_name', + 'actor_uid', + ) + + def __len__(self): + return len(self._context_keys) + + def __iter__(self): + return iter(self._context_keys) + + def __getitem__(self, key: str) -> str: + try: + return _conc_name_getters[key]() + except RuntimeError: + # no local actor/task context initialized yet + return f'no {key} context' + + def get_logger( name: str = None,