我有一个装饰师,如果发生僵局,则可以重试一些操作3次,并且在此过程中进行了一些登录:
def retry_on_deadlock(func):
logger = logging.getLogger('test')
@wraps(func)
def decorated(*args, **kwargs):
retry_count = 0
while retry_count < 3:
try:
return func(*args, **kwargs)
except DeadLockException:
retry_count += 1
if retry_count == 3:
raise
logger.warning('We are in the decorated function here')
return decorated
@retry_on_deadlock
def crucial_function(value):
with value:
do_something()
crucial_function(important_data)
我们的记录格式包括%(funcName)s
,在这种特定情况下,它将对decorated
进行评估。有没有办法使crucial_function
出现在日志中?
我已经尝试实现记录过滤器,但是它需要的逻辑变得有些麻烦,因为它需要检查堆栈,如果日志记录直接发生在decorated
功能中(即。功能(它将在日志记录上覆盖funcName
。但是,如果这是唯一的方法,我将可悲地接受它。
update :这与这个问题不同,因为我并不真正在乎功能签名(实际上,这是由@wraps
Decorator保留的(。我想指示logging
库通过%(funcName)s
,%(filename)s
和%(lineno)s
登录函数名称时从堆栈跟踪中跳过一个级别。
刚刚在编写记录包装纸时面对这个问题。
不小心找到了解决方案。在Python3.8时
来自文档
第三个可选的关键字参数是stacklevel,默认为1。如果大于1,则在计算为记录事件创建的loogrecord中设置的行号和函数名称时,会跳过相应的堆栈帧数。这可以用于记录助手,以便记录的功能名称,文件名和行号不是辅助功能/方法的信息,而是其呼叫者的信息。此参数的名称反映了警告模块中等效的名称
我希望这对未来的研究人员有帮助。