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



我有一个装饰师,如果发生僵局,则可以重试一些操作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中设置的行号和函数名称时,会跳过相应的堆栈帧数。这可以用于记录助手,以便记录的功能名称,文件名和行号不是辅助功能/方法的信息,而是其呼叫者的信息。此参数的名称反映了警告模块中等效的名称

我希望这对未来的研究人员有帮助。

最新更新