Python中logging.getLogger(__name__)默认继承规则不生效问题
问题原因
logging.config.fileConfig方法默认将disable_existing_loggers参数设为True,调用该方法后,所有配置加载前已经创建的非根日志器都会被自动禁用。- 你的代码在初始化日志配置前就已经导入了
ModuleB下的模块,模块导入时就执行了logging.getLogger(__name__)创建了对应日志器,这些日志器后续被配置逻辑禁用,自然无法输出日志。
根日志器不受disable_existing_loggers参数影响,所以直接获取根日志器可以正常输出,但会丢失模块来源信息。
解决方案
方案1:修改配置调用参数
直接在调用fileConfig时添加disable_existing_loggers=False,禁止自动禁用已创建的日志器,修改后__main__.py的对应代码为:
import logging import logging.config if __name__ == '__main__': # 初始化日志配置,关闭自动禁用已有日志器的逻辑 logging.config.fileConfig(fname='FILE.ini', disable_existing_loggers=False) logger = logging.getLogger(__name__) logger.info('The APP has started') logger.debug('This goes to the logfile') # 业务模块导入放在日志初始化之后也可正常工作 import ModuleB
方案2:调整导入顺序
所有业务模块的导入操作放到日志配置初始化之后执行,避免在配置加载前创建子模块日志器。注意不要在__main__.py的顶部导入业务模块,统一放到日志初始化完成后再导入。
额外排查点
如果调整后仍有问题,可以检查你的FILE.ini配置:
- 确认根日志器的日志级别设置不高于你需要输出的级别(比如根日志器设为
WARNING的话,INFO级别的日志自然不会输出) - 确认你配置的handler没有设置过高的过滤级别,也没有额外的过滤规则屏蔽子模块日志
内容的提问来源于stack exchange,提问作者AbianG
相关产品推荐
相关产品推荐

