python - 如何从装饰器装饰的函数中访问在装饰器中声明的日志记录对象?
问题描述
蟒蛇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()
以反映完全限定名称
解决方案
推荐阅读
- tensorflow - Tensorflow Federated 如何从服务器更新模型
- python - 从 JSON 文件中获取特定密钥
- python - 更新使用中间件(last_activity 字段)扩展默认用户的配置文件模型 DRF
- java - 在 Eclipse 中选择 run as 'maven build...' 之前是否需要始终选择'update project'?
- swift - 长按通话按钮后如何添加应用程序
- javascript - Canavs 并没有画出所有的点。只有一个出现
- java - 防止用户输入多个答案
- javascript - 导出配置时将 eslint 配置从 json 转换为 JavaScript 会引发错误
- r - 向字符串添加破折号
- typescript - 反应本机中的Typescript forwardRef错误