首页 > 解决方案 > 如何所有模块都记录到根记录器?

问题描述

我正在使用dictConfig(从文件加载),并且我希望所有内容都默认为我在根记录器上设置的处理程序。所以如果my.module我有

logger = logging.getLogger(__name__)

logger.debug("debug msg")
logger.info("info msg")

如果没有在我的日志记录配置中指定任何特殊内容my.module,则应根据我在根记录器上设置的配置处理调试和信息。我读过的所有内容都表明这应该可行。来自https://docs.python.org/3/howto/logging.html#logging-advanced-tutorial

子记录器将消息传播到与其祖先记录器关联的处理程序。因此,没有必要为应用程序使用的所有记录器定义和配置处理程序。为顶级记录器配置处理程序并根据需要创建子记录器就足够了。(但是,您可以通过将记录器的传播属性设置为 False 来关闭传播。)

但是,我发现这不起作用,除非我dictConfig明确列出每个记录器。如果我不这样做,我的配置似乎都不会生效。(您可以比较我的演示项目的分支和损坏的分支。)

我从一个yaml文件加载dictConfig

  with open("resources/logging.yaml") as f:
    loggingConfig = yaml.safe_load(f)
  logging.config.dictConfig(loggingConfig)

我真的不明白这两种情况有什么不同——我已经查看了诸如级别、有效级别、父级、处理程序等之类的东西,它们在两种情况下看起来都是一样的。我正在设置propagate=True,但实际上没有那个片段,记录器仍然有propagate=True. 我也可以使用一个解决方案,让我在我创建的每个记录器上设置一些神奇的属性,例如。

logger = logging.getLogger(__name__)
logger.setMagicalPropertyHere()

(顺便说一句,我是带着 log4j 的心态来的,这可以解释我的困惑)

标签: pythonlogging

解决方案


推荐阅读