【问题标题】:Python logging for non-trivial uses?用于非平凡用途的 Python 日志记录?
【发布时间】:2009-10-16 23:04:28
【问题描述】:

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

整体设置应如下所示。在这个例子中,我将尽一切努力简化代码。


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 logging


    【解决方案1】:

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

    ROOT
    BOTTOM HANDLER
    TOP HANDLER
    ROOT
    

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

    top.propagation = False
    

    【讨论】:

    • 谢谢!这正是我想要的!
    • 正确的命令是top.propagate = False而不是传播。
    【解决方案2】:

    来源被不同的案例标识符弄乱了,更有用的版本:

    import logging, sys
    root = logging.getLogger('')
    level1 = logging.getLogger('level1')
    level2 = logging.getLogger('level1.level2')
    
    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 HANDLER - %(msg)s'))
    top_handler.setFormatter(logging.Formatter('level1 HANDLER - %(msg)s'))
    bottom_handler.setFormatter(logging.Formatter('level2 HANDLER - %(msg)s'))
    
    msg_killer = KillFilter()
    
    root.addHandler(root_handler)
    level1.addHandler(top_handler)
    level2.addHandler(bottom_handler)
    
    level1.addFilter(msg_killer)
    level1.propagate = False
    
    root.error('root_message')
    level1.error('level1_message')
    level2.error('level2_message')
    

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多