首页 > 解决方案 > 派生记录器中的 LogRecord 属性

问题描述

我想使用一个记录器,它也知道处理我的附加日志级别verbosetrace。因此,我创建了一个从基本记录器派生的自定义记录器

import logging

class DefaultLogger(logging.Logger):

    def __init__(self, name):
        logging.Logger.__init__(self, name)

        # Using propagation of child to parent, by default
        self.propagate = True
        self.setLevel(logging.NOTSET)

    def verbose(self, msg, *args, **kwargs):
        self.log(logging.VERBOSE, msg, *args, **kwargs)

    def trace(self, msg, *args, **kwargs):
        self.log(logging.TRACE, msg, *args, **kwargs)

我使用带有一些标准格式LogRecords 属性的记录器,例如filenameor funcName

    "format":"%(asctime)s - %(levelname)s - %(filename)s:%(funcName)s - %(message)s"

对于原始日志级别,这很有吸引力,

2021-10-28 09:47:32,039 - 信息 - uploadData.py:main - 消息

但是对于我的自定义日志级别,我得到了我的自定义记录器类的来源:

2021-10-28 09:47:32,040 - TRACE - DefaultLogger.py:trace - 消息

当然这不是我想要的,我对这个类不感兴趣,我想要调用方法。

我该怎么做才能解决这个问题?

标签: pythonloggingformattingderived-class

解决方案


我已经搜索了很多关于这个问题的信息。主要问题显然是,在基类Logger中,有一个findCaller方法,它在堆栈中搜索调用模块。在我的情况下,那是我的派生类,这是低一级。

我的选择是覆盖findCaller,但我找到了一个更简单的解决方案。也许有点难看,但像魅力一样工作:

我换了线..

self.log(logging.VERBOSE, msg, *args, **kwargs)

经过 ..

self._log(logging.VERBOSE, msg, args, exc_info=None, extra=None, stack_info=False)

作为log内部调用_log并且我省略了这个方法,findCaller 方法现在具有正确的分辨率,因为它具有与标准 Logger 中完全相同的调用方法计数。


推荐阅读