子类logging.Formatter更改logging.Formatter的默认行为 [英] Subclassing logging.Formatter Changes Default Behavior of logging.Formatter

查看:61
本文介绍了子类logging.Formatter更改logging.Formatter的默认行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在记录器中添加了两个具有不同格式化程序的处理程序.第一个需要子类logging.Formatter进行自定义格式化.默认的格式化程序足以满足第二个处理程序的要求.

I added two handlers with different formatters to my logger. The first one requires subclassing logging.Formatter to do custom formatting. The default formatter will suffice for the second handler.

比方说,第一个格式化程序只是从消息中删除换行符.以下脚本说明了看似奇怪的行为:

Let's say the first formatter simply removes newline characters from the message. The following script illustrates what seems like strange behavior:

import logging

logger = logging.getLogger(__name__)

class CustomFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def format(self, record):
        record.msg = record.msg.strip().replace('\n', ' ')
        return super().format(record)

h1 = logging.StreamHandler()
formatter1 = CustomFormatter(fmt=None, datefmt=None)
h1.setFormatter(formatter1)
logger.addHandler(h1)

h2 = logging.StreamHandler()
formatter2 = logging.Formatter(fmt=None, datefmt=None)
h2.setFormatter(formatter2)
logger.addHandler(h2)

logger.warning('string with\nmultiple lines')

这将输出以下内容:

string with multiple lines
string with multiple lines

我原本是这样的:

string with multiple lines
string with 
multiple lines

第二个格式化程序不应实现CustomFormatter的行为,但可以实现.当我颠倒处理程序添加到记录器的顺序时,这不会发生.

The second formatter should not implement the behavior of CustomFormatter, yet it does. When I reverse the order in which the handlers are added to the logger, this doesn't happen.

除非我误解了子类,否则不应通过重写子类中的方法来更改基类的行为.当我覆盖logging.Formatter以外的类的方法时,这似乎不是问题.

Unless I misunderstand subclassing, the behavior of the base class should not be altered by overriding a method in a subclass. This doesn't seem to be a problem when I override methods of classes other than logging.Formatter.

这是日志记录模块中的错误,还是我在这里缺少了什么?

Is this a bug in the logging module, or am I missing something here?

推荐答案

这行是你的失败:

record.msg = record.msg.strip().replace('\n', ' ')

您将清理后的字符串重新分配给记录,记录器附带的所有其他处理程序/格式化程序都使用该记录.复制记录即可使用

You reassigned the scrubbed string to the record which is used by all remaining handlers/formatters attached to the logger. Copy the record and it works:

import logging
from copy import copy

logger = logging.getLogger(__name__)

class CustomFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def format(self, record):
        record = copy(record)
        record.msg = record.msg.strip().replace('\n', ' ')
        return super().format(record)

h1 = logging.StreamHandler()
formatter1 = CustomFormatter(fmt=None, datefmt=None)
h1.setFormatter(formatter1)
logger.addHandler(h1)

h2 = logging.StreamHandler()
formatter2 = logging.Formatter(fmt=None, datefmt=None)
h2.setFormatter(formatter2)
logger.addHandler(h2)

logger.warning('string with\nmultiple lines')

输出

string with multiple lines
string with
multiple lines

这篇关于子类logging.Formatter更改logging.Formatter的默认行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆