【发布时间】:2018-10-12 16:15:35
【问题描述】:
我有一个 Python 包,其中包含一系列模块,每个模块都包含一个具有中心焦点的例程库(即一个模块可能具有与文本操作相关的例程)。我希望能够为整个包配置日志记录,但让用户能够自定义给定模块的日志记录。
我尝试使用父/子记录器来实现这一点,这样每个模块就不必拥有超过 1 个记录器。如果我在模块本身中配置子记录器,我可以成功使用父/子方法,但是我找不到通过记录器配置文件配置子记录器的正确语法。当 Python 日志记录实用程序读入配置文件时,它会阻塞任何包含点表示法的记录器“键”(即,如果我尝试定义记录器“root、parent、parent.child”,则配置文件的摄取将阻塞“ parent.child”键)。
所以,我正在寻找一种解决方案,即给定模块只需有一个记录器,但用户可以以一种方式为整个包配置日志记录,但为特定模块配置不同的方式。父/子方法似乎最有前途。
如果模块有办法确定日志管理器定义的记录器,我也可以使用它。例如,假设我可以在名为 allUtil 和 textUtil 的日志记录配置文件中定义两个记录器。如果文本实用程序模块可以确定日志管理器是否定义了 textUtil 记录器,则它可以使用该记录器,否则它将使用 allUtil 记录器。不幸的是,我也无法找出正确的 Python 代码来执行此操作。
我愿意接受建议。
【问题讨论】:
-
我明白了,您基本上想在配置文件中定义一堆记录器,然后让您的每个模块在该配置中发现自己的自定义记录器(如果有的话),或者使用通用的万能的,如果没有自定义的?
-
库代码获取一个记录器(带有
logging.getLogger(name))并使用它。应用程序代码配置记录器(dictConfig通常是最有用的方法)。库代码绝不能尝试配置日志记录,也不必关心配置了哪些记录器以及如何配置。 -
请发布 MCVE。配置子记录器 JustWorks(tm),我在 django 项目中经常这样做。
标签: python logging parent-child