Skip to main content
 首页 » 编程设计

用于非平凡用途的 Python 日志记录

2025年05月04日13lexus

我正在尝试使用 python 日志记录模块来做复杂的事情。我将省略这种设计的动机,因为它会大大延长帖子,但我需要有一个根记录器,它为我们的代码和使用日志记录的库发送常规日志文件——以及其他记录器的集合到不同的日志文件。

整体设置应如下所示。在此示例中,我将对 stdout 进行所有操作以简化代码。

 
import logging, sys 
root = logging.getLogger('') 
top = logging.getLogger('top') 
bottom = logging.getLogger('top.bottom') 
 
class KillFilter(object): 
    def filter(self, msg): 
        return 0 
 
root_handler = logging.StreamHandler(sys.stdout) 
top_handler = logging.StreamHandler(sys.stdout) 
bottom_handler = logging.StreamHandler(sys.stdout) 
root_handler.setFormatter(logging.Formatter('ROOT')) 
top_handler.setFormatter(logging.Formatter('TOP HANDLER')) 
bottom_handler.setFormatter(logging.Formatter("BOTTOM HANDLER")) 
 
msg_killer = KillFilter() 
 
root.addHandler(root_handler) 
top.addHandler(top_handler) 
bottom.addHandler(bottom_handler) 
 
top.addFilter(msg_killer) 
 
root.error('hi') 
top.error('hi') 
bottom.error('hi') 

这输出

 
ROOT 
BOTTOM HANDLER 
ROOT 

第二个根处理程序调用不应该,因为根据日志记录文档,msg_killer 将阻止消息上升到根记录器。显然,文档需要改进。

编辑:删除了我对 python 日志记录的“当下”的严厉措辞。

请您参考如下方法:

首先,我在我的机器上得到了不同的输出(运行 Python 2.6):

ROOT 
BOTTOM HANDLER 
TOP HANDLER 
ROOT 

过滤仅应用于向其发出消息的记录器,如果它通过过滤器,则它会传播到父记录器的所有处理程序(而不是记录器本身)——我不知道基本原理对于这个决定。如果您想在“顶级”Logger 实例处停止传播,请设置:

top.propagation = False