Как я могу получить доступ к объекту регистрации, объявленному в декораторе из функции, которую он декорирует? - PullRequest
1 голос
/ 08 апреля 2019

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(), чтобы отразить полное имя

...