如何从装饰器中声明的日志对象从其装饰函数中访问?

时间:2019-04-08 18:04:20

标签: python logging scope decorator

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()内的行以反映全限定名称

0 个答案:

没有答案