在装饰器中记录funcName时显示原始功能

时间:2019-05-17 08:53:46

标签: python logging stack-trace

如果发生死锁,我有一个装饰器重试某些操作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记录函数名称时,从堆栈跟踪中跳过一层。

0 个答案:

没有答案