python - 派生记录器中的 LogRecord 属性
问题描述
我想使用一个记录器,它也知道处理我的附加日志级别verbose和trace。因此,我创建了一个从基本记录器派生的自定义记录器
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 属性的记录器,例如filename
or 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 - 消息
当然这不是我想要的,我对这个类不感兴趣,我想要调用方法。
我该怎么做才能解决这个问题?
解决方案
我已经搜索了很多关于这个问题的信息。主要问题显然是,在基类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 中完全相同的调用方法计数。
推荐阅读
- regex - My regex match is grabbing extra leading and trailing whitespaces. How can I only capture the phone number?
- java - 比较 2 个不同大小的数组列表并将不相等的值放在另一个数组中
- laravel - 如何使用 laravelcollective 在 Laravel 中上传 excel 文件?
- macros - 使用构建宏生成构造函数调用
- javascript - 页面滚动位置对应的CSS动画
- css - 当多个ID具有相同的代码时,编写更少代码的正确方法是什么?
- javascript - 如何在 karma 中导入 es6 模块
- php - 为什么 get_the_post_thumbnail_url 不适用于自定义添加大小?
- log4j2 - log4j2 DynamicThresholdFilter 没有拾取属性值
- git - 如何从指定的 git 分支压缩所有更改