2016-06-18 96 views
4

我添加了两个具有不同格式化的处理程序到我的记录器。第一个需要继承日志记录.Formatter自定义格式。第二个处理程序默认的格式化程序就足够了。继承logging.Formatter更改默认行为logging.Formatter

比方说,第一个格式化程序只是从消息中删除换行符。下面的脚本说明了什么似乎是奇怪的现象:

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,但它的确如此。当我将处理程序添加到记录器的顺序颠倒时,这不会发生。

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

这是记录模块中的错误,还是我在这里丢失了一些东西?

+0

有趣的是,我没有'logger.handlers [1] .formatter = None'和记录器仍然愉快地印刷两行。但是'logger.handlers [1] = None'按预期破坏了事情。 – tdelaney

回答

2

这条线是你往下掉:

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

您重新分配洗涤的字符串,这是通过使用连接到记录器所有剩余的处理/格式化记录。复制该记录和它的工作原理:

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 
+0

这很有道理 - 谢谢指出我的失误! –