python - 导入时间记录器命名与日志记录配置之间的不兼容性

标签 python logging import

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

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

如果不进行大量重构,我不能轻易地延迟这些模块的导入,那么有没有其他方法能够保留这种通过模块名称设置记录器的方法,同时仍然在以后加载日志配置?

最佳答案

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

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

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

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

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

如果您发布有关似乎已损坏的内容的更多详细信息,我可能能够更好地诊断正在发生的事情。

关于python - 导入时间记录器命名与日志记录配置之间的不兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608717/

相关文章:

c# - Serilog 相当于 log4net.Config.Watch?

python - .so 文件的无效 elf header 错误

Java,尝试根据命令长度创建特定的网络字节头

python - 如何在 visual studio 代码中内置运行 python tox 命令和测试

python - 使用 mod_wsgi 记录 flask 错误

wordpress - WordPress调试

css - LESS 导入不起作用

python - 如何获取 __init__.py 文件中导入的当前模块?

php - MediaWiki python 端口?

Python ASCII 编解码器在写入 CSV 时无法编码字符错误