【问题标题】:LogRecord attributes in a derived logger派生记录器中的 LogRecord 属性
【发布时间】:2021-12-13 12:07:42
【问题描述】:

我想使用一个记录器,它也知道处理我的附加日志级别 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 attributes,例如filenamefuncName

    "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 - 消息

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

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

【问题讨论】:

  • 至今没有答案?我的问题是不是太复杂了?我的用例有那么不寻常吗?

标签: python logging formatting derived-class


【解决方案1】:

我已经搜索了很多关于这个问题的信息。主要问题显然是,在基类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 中的调用方法数完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多