我正在通过读取文件并使用 fileConfig 来设置我的 Python 登录 main.py选项。我希望能够在测试和实时日志记录配置之间切换,所以我想先读入一个单独的配置文件,然后从那里提取日志记录配置文件路径。
这里的问题是我从 main.py 导入的其他文件通过 log = getLogger(__name__)
获取它们自己的记录器,这发生在导入时。当加载新配置时,这些链接就会断开,并且这些模块最终没有按照我预期的方式进行日志记录。
如果不进行大量重构,我不能轻易地延迟这些模块的导入,那么有没有其他方法能够保留这种通过模块名称设置记录器的方法,同时仍然在以后加载日志配置?
最佳答案
我不确定你的问题到底是怎么回事,但我是这样看的。执行 log = logging.getLogger(__name__)
的各种模块将具有其记录器的有效名称(记录器名称 = 包名称),除非您以某种方式实际将模块移动到其他包位置。
在导入时,日志记录配置可能已设置也可能未设置,并且不应该有任何实际的日志记录调用作为导入的副作用(如果有,消息可能无处可去) .
使用 fileConfig
加载新配置通常只是在记录器上设置处理程序、格式化程序和级别。
当您随后在导入的模块中调用代码时,它们会通过它们的记录器进行记录,这些记录器具有您之前的配置调用附加的处理程序 - 因此它们将根据配置输出。
您应该知道,在旧版本的 Python (<= 2.5) 上,调用 fileConfig
将不可避免地禁用配置中未命名的现有记录器 - 在较新的 Python 版本中 ( >= 2.6),这可以使用传递给 fileConfig
的 disable_existing_loggers=False
关键字参数进行配置。您可能需要检查一下,因为它有时会导致意外行为(该参数的默认值为 True
,以便与旧 Python 版本下的行为兼容)。
如果您发布有关似乎已损坏的内容的更多详细信息,我可能能够更好地诊断正在发生的事情。
关于python - 导入时间记录器命名与日志记录配置之间的不兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608717/