首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子类logging.Formatter更改logging.Formatter的默认行为

子类logging.Formatter更改logging.Formatter的默认行为
EN

Stack Overflow用户
提问于 2016-06-18 18:51:53
回答 1查看 1.9K关注 0票数 5

我在我的记录器中添加了两个具有不同格式化程序的处理程序。第一种方法需要子类logging.Formatter来执行自定义格式。对于第二个处理程序,默认格式化程序就足够了。

假设第一个格式化程序只是从消息中删除换行符。下面的脚本说明了似乎很奇怪的行为:

代码语言:javascript
运行
复制
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')

这将产生以下结果:

代码语言:javascript
运行
复制
string with multiple lines
string with multiple lines

相反,我希望这样:

代码语言:javascript
运行
复制
string with multiple lines
string with 
multiple lines

第二种格式化程序不应该实现CustomFormatter的行为,但它确实实现了。当我反转将处理程序添加到记录器的顺序时,这种情况不会发生。

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

这是日志模块中的一个bug,还是我在这里遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-18 20:21:43

这句话是你的堕落:

代码语言:javascript
运行
复制
record.msg = record.msg.strip().replace('\n', ' ')

您将擦除的字符串重新分配到记录中,该记录由附加到记录器的所有其余处理程序/格式化程序使用。复制记录,它工作:

代码语言:javascript
运行
复制
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')

输出

代码语言:javascript
运行
复制
string with multiple lines
string with
multiple lines
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37900521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档