Parent 级别低于 child 的记录器

Parent logger with level lower than child's

包为顶层定义一个记录器并让每个子模块通过 logging.getLogger(__name__) 使用一个 child 记录器是一种常见的做法。

问题:Parent 记录器的级别低于 child。

我想特别禁用来自 package.module 的 DEBUG 日志,但要保持整体日志级别为 DEBUG。我试过这样的事情 -

logging.config.dictConfig({
  "loggers": {
     "package": {
        "level": "DEBUG",
        "handlers": ["console"],
      },
      "package.module": {
         "level": "INFO"
      }
  }
})

然而,这并没有像我预期的那样工作,只要 child 记录器传播它的日志,DEBUG 日志就会由 parent.

输出

我可以在这里做什么来阻止某些级别的 child? 我可以将传播设置为 False,但这会完全阻止日志,这是不可取的。

对我来说工作正常,向“包”发送“调试”消息,而向“package.module”发送的消息不发送:

import logging, logging.config

logging.config.dictConfig({
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        }
    },
    "loggers": {
        'root': {
            'handlers': ['console'],
        },
        "package": {
            "level": "DEBUG",
        },
        "package.module": {
            "level": "INFO"
        }
    }
})


logging.getLogger('package').debug("should be emitted")
logging.getLogger('package.module').debug("should not be emitted")

记录器应在接收时过滤消息,因此根据记录消息时的文档,如果其级别低于记录器的有效级别,记录器的有效级别是从记录器遍历到记录器树的根时找到的除NOTSET之外的第一个级别。如果遍历没有找到任何东西,那么有效级别是 NOTSET 并且发出所有消息(即使是低于 DEBUG 的消息)。

然而,这意味着如果 package.module 的后代配置回 DEBUG 将覆盖 package.module。这是一个重要的概念:记录器的级别是摄入过滤器,一旦记录被接受,它们就不再是考虑因素。

propagate 的用例非常不同,当您在树的中间级别配置“发射”处理程序时使用它(否则记录将被发射多次)。