Python日志记录,如何过滤特定的记录器

时间:2015-03-18 15:53:16

标签: python logging filter

这似乎是一个非常简单的问题,但我找不到任何好的例子。

我想过滤一个具有特定名称的记录器。

例如

import logging

logging.root.setLevel(logging.DEBUG)
logging.root.addHandler(logging.StreamHandler())
logging.root.addFilter(logging.Filter(name="a"))

a = logging.getLogger("a")
b = logging.getLogger("b")

a.info("aaaaa")
b.info("bbbbb")

我希望root logger会过滤来自b的邮件,因为我知道logging.Fileter只会传递namechilds of the name

但正如你所料,它只是传递了所有信息。

我误解了什么?

2 个答案:

答案 0 :(得分:3)

正如logging文档所述:

  

由后代记录器生成的事件不会被记录器的过滤器设置过滤,除非过滤器也已应用于那些后代记录器

如果您只想关闭子记录器中的消息,您只需设置其级别:

logging.getLogger("a").setLevel(logging.CRITICAL + 1)

答案 1 :(得分:1)

我刚刚学习同样的问题。如果您查看https://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial处的流程图(或阅读上面文档中的句子),您可以看到LOGGERS上的过滤器仅应用于初始日志事件,但不是在将记录传播到父记录器时。因此,似乎过滤器应该几乎总是应用于处理程序而不是记录器。

在原始示例中,将名称过滤器添加到流处理程序将按预期工作。

我期待这样的事情发挥作用:

class RestFilter(logging.Filter):
    def filter(self,record):
        return '/rest' not in record.msg

# Add the filter to the root logger
logging.getLogger().setFilter(RestFilter())

我认为向根添加过滤器会在将记录传递给连接到root的所有处理程序之前过滤所有记录。但这只会过滤掉根目录下的记录。如果有任何评论者可以提出这种设计的理由,我很好奇。