python - 如何所有模块都记录到根记录器?
问题描述
我正在使用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 的心态来的,这可以解释我的困惑)
解决方案
推荐阅读
- regex - 如何自动格式化一段代码?
- python - 当有 nan 条目时,如何将 DF whit 中的名称与姓氏连接起来
- python - 如何获得跨特定维度的张量的 MSE?
- unit-testing - 值不能为空。(参数'connectionString') Xunit 测试
- amazon-web-services - AWS Athena 无法在表上运行任何 WHERE 子句
- .net - PowerBi Rest API GetActivityEvents 属性缺失
- c# - sqllite xamarin.forms async 停止响应
- java - 使用https在java中休息api
- mongodb - 在 Openshift Online 上连接到 MongoDB 远程
- node.js - 使用 Cloud Function 删除 Firebase 实时数据库节点