导入时记录器命名与日志记录配置不兼容

时间:2012-03-07 20:41:20

标签: python logging import

我通过读取文件并使用fileConfig选项在main.py中设置我的Python日志记录。我希望能够在测试和实时日志记录配置之间切换,所以我想先读取一个单独的配置文件,然后从那里提取日志配置文件路径。

这里的问题是我从main.py导入的其他文件通过log = getLogger(__name__)获取自己的记录器,这在导入时发生。加载新配置后,这些链接会被破坏,这些模块最终没有按照我的预期进行日志记录。

在没有大量重构的情况下,我无法轻易地延迟导入这些模块,那么是否还有其他方法可以保留这种按模块名称设置记录器的方法,同时仍然在日志配置中加载? / p>

1 个答案:

答案 0 :(得分:2)

我不确定你的问题究竟是怎么破坏的,但这就是我看到它的方式。执行log = logging.getLogger(__name__)的各种模块将具有其记录器的有效名称(记录器名称=包名称),除非您以某种方式实际将模块移动到其他包位置。

在导入时,日志配置可能已设置,也可能未设置,并且不应该进行任何实际的日志记录调用作为导入的副作用(如果存在,则消息可能无处可去)

使用fileConfig加载新配置通常只会在记录器上设置处理程序,格式化程序和级别。

当您随后在导入的模块中调用代码时,他们会通过他们的记录器进行记录,这些记录器具有先前配置调用附加的处理程序 - 因此它们将根据配置进行输出。

你应该知道,在旧版本的Python(< = 2.5)上,对fileConfig的调用将不可避免地禁用配置中未命名的现有记录器 - 在更新版本的Python中(> = 2.6),这可以使用传递给disable_existing_loggers=False的{​​{1}}关键字参数进行配置。您可能需要检查这一点,因为它有时会导致意外行为(该参数的默认值为fileConfig,以便与较旧的Python版本下的行为兼容)。

如果你发布更多关于看似破碎的细节,我或许可以更好地诊断出现了什么。

相关问题