Python 如何将所有模块都记录到根记录器?
我使用的是Python 如何将所有模块都记录到根记录器?,python,logging,Python,Logging,我使用的是dictConfig(从文件加载),我希望将所有内容都默认为在根记录器上设置的处理程序。因此,如果在my.module中 logger=logging.getLogger(\uuuuu name\uuuuu) logger.debug(“debug msg”) logger.info(“info msg”) 在我的日志记录配置中,没有指定任何关于my.module的特殊信息,调试和信息应该按照我在根记录器上设置的配置进行处理。我所读到的一切都表明这应该是可行的。发件人: 子记录器将消
dictConfig
(从文件加载),我希望将所有内容都默认为在根记录器上设置的处理程序。因此,如果在my.module
中
logger=logging.getLogger(\uuuuu name\uuuuu)
logger.debug(“debug msg”)
logger.info(“info msg”)
在我的日志记录配置中,没有指定任何关于my.module
的特殊信息,调试和信息应该按照我在根记录器上设置的配置进行处理。我所读到的一切都表明这应该是可行的。发件人:
子记录器将消息传播到与其祖先记录器关联的处理程序。因此,不需要为应用程序使用的所有记录器定义和配置处理程序。为顶级记录器配置处理程序并根据需要创建子记录器就足够了。(但是,可以通过将记录器的“传播”属性设置为False来关闭传播。)
然而,我发现除非我的dictConfig
明确列出每个记录器,否则这是行不通的。如果我不这样做,我的配置似乎都不会生效。(您可以比较我的演示项目的分支。)
我从带有
以open(“resources/logging.yaml”)作为f:
loggingConfig=yaml.安全荷载(f)
logging.config.dictConfig(loggingConfig)
我真的不明白在这两种情况下有什么不同——我观察了级别、有效级别、父级、处理程序等,它们在这两种情况下似乎是相同的。我正在设置propagate=True
,但事实上,如果没有该代码段,记录器仍然具有propagate=True
。我也可以使用一个解决方案,只需在我创建的每个记录器上设置一些神奇的属性,例如
logger=logging.getLogger(\uuuuu name\uuuuu)
logger.setMagicalPropertyHere()
(顺便说一句,我是带着log4j的心态来的,这可以解释我的困惑)也许这只是时间问题?是否在初始化主记录器之前创建了子记录器?@MarkRansom-hmm,我正在定义记录器之后加载配置。我想应该是这样的,因为我只在我的
\uuuu main\uuuu
部分中加载配置,它需要在末尾。也许这意味着我需要将那些\uuuuu main\uuuu
部分从带有“常规”代码的文件中移出?事实上,就是这样!你应该发布一个答案,这样我就可以接受了。您可以引用以下内容:。(如果可以,我甚至会为您编辑答案)