如何给现有的Python日志格式化器添加前缀

13

在我的代码中,我从客户端获取一个日志记录器,然后执行一些操作并将分析结果记录到日志记录器中。

我想添加自己的前缀到日志记录器中,但是我不想创建自己的格式化程序,只想将我的前缀添加到现有的格式化程序中。

此外,我想在我的代码完成后删除我的前缀。

根据文档,我只能找到创建新格式化程序而不能修改现有格式化程序的方法。是否有方法可以实现这一点?

3个回答

14
您是正确的。根据 Python 3Python 2 文档,没有办法重置现有格式化程序对象上的格式,您确实需要创建一个新的 logging.Formatter 对象。但是,在运行时查看对象时,存在 _fmt 方法可获取现有格式,并且似乎调整它会起作用。我在 2.7 中尝试过,它可以工作。以下是示例。
Python 2.7 的示例代码:
import logging
logger = logging.getLogger('something')
myFormatter = logging.Formatter('%(asctime)s - %(message)s')
handler = logging.StreamHandler()
handler.setFormatter(myFormatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info("log statement here")

#Tweak the formatter
myFormatter._fmt = "My PREFIX -- " + myFormatter._fmt
logger.info("another log statement here")

输出:

2015-03-11 12:51:36,605 - log statement here
My PREFIX -- 2015-03-11 12:51:36,605 - another log statement here

10

使用 logging.LoggerAdapter 可以实现此功能。

import logging    


class CustomAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        return f"[my prefix] {msg}", kwargs


logger = CustomAdapter(logging.getLogger(__name__))

请注意,只有消息将受到影响。但是这种技术可以用于更复杂的情况。

1
你可能在低版本的Python上运行时遇到错误,例如Python 3.8。
E1120:构造函数调用中参数“extra”没有值(无参数值)。
- northtree
1
在 Python 3.9 下,我们需要提供额外的参数,例如:logger = CustomAdapter(logging.getLogger(__name__), {}) - northtree

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接