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