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

Python logging, how to filter a specific logger

这似乎是一个很简单的问题,但我找不到适合我的例子。

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

例如

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")

我预计根记录器会过滤来自 b 的消息,因为我知道 logging.Filter 只传递 namechilds of the name

但如您所料,它只是传递了所有消息。

我理解错了什么?

logging 文档所述:

events which have been generated by descendant loggers will not be filtered by a logger’s filter setting, unless the filter has also been applied to those descendant logger

如果你只是想关闭来自子记录器的消息,你可以设置它的级别:

logging.getLogger("a").setLevel(logging.CRITICAL + 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())

我认为向根添加过滤器会在记录传递给附加到根的所有处理程序之前过滤所有记录。但这只会过滤在根目录下输入的记录。我很好奇是否有任何评论者可以提出这种设计的基本原理。