【问题标题】:How to prevent reconfiguration of root logger by modules in a multi-module project?如何防止多模块项目中的模块重新配置根记录器?
【发布时间】:2018-09-22 16:01:40
【问题描述】:

我将 python 2.7 用于多模块项目。正如here 所提到的,我已经在我的 main.py 中配置了日志记录,如下所示

logging.basicConfig(
    format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%d-%m-%Y:%H:%M:%S',
    filename='/home/ubuntu/logs/centralized_upgrade.log',
    level=logging.INFO)

在我必须登录的所有其他模块中,我只是在拨打如下所示的电话

import logging
...
logging.info('Hello World')

但我的疑问是,是否在某些模块中再次重新配置了根记录器(可能如下所示)

logging.basicConfig(
        format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
        datefmt='%d-%m-%Y:%H:%M:%S',
        filename='/home/ubuntu/logs/module.log',
        level=logging.INFO)

然后所有日志消息将开始进入新文件。有人可以让我知道处理此问题的最佳方法是什么吗?如何防止重新配置根记录器?我的意图是日志配置应该与main.py 中定义的相同,而不管在任何子模块中进行的任何重新配置​​。

在很多地方,建议不要使用 root logger,并定义一个像 here 提到的 logger。但是根据我在这种情况下的理解,如果某些模块配置了根记录器,那么日志可能会转到不同的文件,因为所有记录器都从根记录器继承。

【问题讨论】:

  • 不是一个完整的答案,但是:如果根记录器已经为它配置了处理程序,logging.basicConfig 将不会做任何事情。所以如果它被多次调用,只有第一个会将给定的配置应用到根记录器。
  • 真正的(如果没用的话)答案是“不要使用粗心大意以至于无条件改变全局状态的模块”,无论是根记录器、进程的信号处理还是标准流。
  • 感谢@LukasGraf,这对我有用。

标签: python python-2.7 logging


【解决方案1】:

在这里发布@Lukas Graf 的评论作为答案

不是一个完整的答案,但是:logging.basicConfig 不会做任何事情 如果根记录器已经为其配置了处理程序。所以如果是 多次调用,只有第一个会应用给定的 配置到根记录器。

【讨论】:

    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 2021-11-18
    • 2023-03-08
    • 2012-02-14
    • 2017-09-21
    • 2013-12-13
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多