如果发生死锁,我有一个装饰器重试某些操作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
。但是,如果这是唯一的方法,我会很遗憾地接受它。
更新:这与this问题不同,因为我并不真正关心函数签名(实际上,该签名由@wraps
保存装饰)。我想指示logging
库通过%(funcName)s
,%(filename)s
和%(lineno)s
记录函数名称时,从堆栈跟踪中跳过一层。