代码之家  ›  专栏  ›  技术社区  ›  SangminKim

Python日志,如何过滤特定的日志

  •  3
  • SangminKim  · 技术社区  · 11 年前

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

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

    例如

    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 仅通过 name childs of the name .

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

    我误解了什么?

    2 回复  |  直到 11 年前
        1
  •  6
  •   Nuno André    7 年前

    logging 文档状态:

    由子代记录器生成的事件不会被记录器筛选器设置筛选,除非该筛选器也已应用于这些子代记录器

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

    logging.getLogger("a").setLevel(logging.CRITICAL + 1)
    
        2
  •  2
  •   user2672165    5 年前

    我刚刚学到了同样的问题。如果您查看流程图 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())
    

    我以为在根目录中添加一个过滤器可以在将记录传递给附加到根目录的所有处理程序之前过滤所有记录。但这只过滤在根处输入的记录。我很好奇是否有评论人士能提出这种设计的理由。