我正在尝试使用python日志记录模块来完成复杂的事情.我将把这个设计的动机留下来,因为它会大大延长帖子,但是我需要一个root logger来为我们的代码和使用日志记录的库发送一个常规日志文件 - 以及一系列其他记录器到不同的日志文件.
整体设置应如下所示.我将在此示例中执行所有操作以简化代码.
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')
Run Code Online (Sandbox Code Playgroud)
这输出
ROOT
BOTTOM HANDLER
ROOT
第二个根处理程序调用不应该因为根据日志记录文档msg_killer将阻止消息进入根记录器.显然,文档可以使用改进.
编辑:删除我的"在当下"苛刻的词汇为python日志记录.
首先,我在我的机器上获得了不同的输出(运行Python 2.6):
ROOT
BOTTOM HANDLER
TOP HANDLER
ROOT
Run Code Online (Sandbox Code Playgroud)
过滤仅应用于发出消息的记录器,如果它通过过滤器,则它会传播到父记录器的所有处理程序(而不是记录器本身) - 我不知道这个决定的理由.如果要在"顶部"Logger实例中停止传播,请设置:
top.propagation = False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |