Python 3.6;Моя общая цель - придерживаться иерархии журналирования, разделенной точками, которую Python, похоже, намеревается использовать, и отразить это в файле журнала.
Я вижу, что у меня есть декоратор длязапись / выход / синхронизация делает именно это, запись в то время как записи журнала для декорируемой функции имеют только имя модуля вместо module.function
.
У меня есть объявление регистратора в верхней части модуля, содержащего функциюЯ работаю с тем, что, как я полагаю, используется в моей функции, а не в декораторе, удаление которого приводит к нерешенным ошибкам в ссылках, поэтому я подозреваю, что не понимаю, как работает область действия в этомчастный случай.
Вот код, который у меня есть:
Setup.py:
def log_wrapper(f):
@functools.wraps(f)
def wrapper(*args,**kwargs):
logger = logging.getLogger('{0}.{1}'.format(f.__module__, f.__qualname__))
ts = timeit.default_timer()
try:
logger.info('Starting {0}'.format(f.__name__))
logger.debug('Parameters: {0} and {1}'.format(args, kwargs))
return f(*args,**kwargs)
except Exception as ex:
logger.exception(ex)
te = timeit.default_timer()
tf = round(ts-te, 2)
logger.info('Ending {0} with a processing time of {1}'.format(f.__name__,
'{0} seconds'.format(tf) if tf < 60 else
'{0} minutes'.format(str(tf/60))))
return wrapper
Utility.py:
from library.setup import log_wrapper
logger = logging.getLogger(__name__)
[...]
@log_wrapper
def foo(args)
И журнал при foo()
вызывается из другого скрипта.Здесь строка 1 регистрируется в вызывающем скрипте, строки 2 и 3 регистрируются в декораторе, а 4 находится внутри foo()
.
2019-04-08 13:45:15 root INFO Running df -hP
2019-04-08 13:45:15 library.utility.foo INFO Starting foo
2019-04-08 13:45:15 library.utility.foo DEBUG Parameters: () and {}
2019-04-08 13:45:15 library.utility INFO Blah
Повторюсь, я бы хотел, чтобы foo()
имел доступ к регистратору library.utility.foo
, объявленному в декораторе, и к строкам, зарегистрированным внутри foo()
, чтобы отразить полное имя