【问题标题】:Incompatibility between import-time logger naming with logging configuration导入时记录器命名与记录配置不兼容
【发布时间】:2012-03-07 20:41:20
【问题描述】:

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

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

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

【问题讨论】:

  • 在加载配置文件之前,我会尝试查看已经初始化的记录器的handlers属性并清除它(例如分配空列表)。跨度>

标签: python logging import


【解决方案1】:

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

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

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

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

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

如果您发布有关似乎损坏的更多详细信息,我也许可以对正在发生的事情提供更好的诊断。

【讨论】:

  • 这是disable_existing_loggers 问题。我没有注意到那个参数,它正在关闭所有以前分配的记录器。
猜你喜欢
  • 2019-04-10
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多