这似乎是一个非常简单的问题,但我找不到任何好的例子。
我想过滤一个具有特定名称的记录器。
例如
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
只会传递name
或childs of the name
。
但正如你所料,它只是传递了所有信息。
我误解了什么?
答案 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的所有处理程序之前过滤所有记录。但这只会过滤掉根目录下的记录。如果有任何评论者可以提出这种设计的理由,我很好奇。