首页 > 解决方案 > 如何从装饰器装饰的函数中访问在装饰器中声明的日志记录对象?

问题描述

蟒蛇3.6;我的总体目标是坚持 Python 似乎打算供您使用的点分隔类型的日志记录层次结构,并将其反映在日志文件中。

我所看到的是,我用于进入/退出/计时的装饰器正是这样做的,记录而被装饰的函数的日志条目只有模块名称而不是module.function.

我在包含我正在使用的函数的模块顶部有一个记录器声明,我假设它是我的函数中实际使用的,而不是装饰器中的那个,删除它会导致大量未解决的引用错误,所以我怀疑我不明白范围在那种特殊情况下是如何工作的。

这是我的代码:

安装程序.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

实用程序.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()以反映完全限定名称

标签: pythonloggingscopedecorator

解决方案


推荐阅读