如何在Python中定义可跨模块访问的全局Logger变量
解决Python全局Logger无输出问题
问题根源
你的代码依赖logging.basicConfig配置日志,但这个函数仅在根Logger未添加任何Handler时才会生效。如果pytest或其他提前运行的代码已经配置了根Logger的Handler,你的basicConfig调用会被直接忽略,导致日志文件无法生成、日志无输出。此外,直接使用根Logger(logging.getLogger())会受全局配置干扰,无法保证模块独立性。
修复后的Logger实现
修改logger.py,手动创建独立命名的Logger并配置Handler,避免依赖全局根Logger:
import logging def get_cg_logger(): # 创建独立命名的Logger,隔离全局配置 logger = logging.getLogger("CGLogger") logger.setLevel(logging.DEBUG) # 避免模块重复导入时重复添加Handler,防止日志重复输出 if not logger.handlers: # 创建文件Handler,指定写入模式 file_handler = logging.FileHandler('zzz.log', mode='w') file_handler.setLevel(logging.DEBUG) # 设置日志格式(可选,按需调整) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(formatter) # 将Handler绑定到Logger logger.addHandler(file_handler) logger.info("start logging") return logger CGLogger = get_cg_logger()
验证步骤
- 保持
mymodule/__init__.py的导入代码不变:from mymodule.logger import CGLogger - 执行测试代码:
from mymodule import CGLogger CGLogger.info("blah")
此时会生成zzz.log文件,包含类似以下格式的日志内容:
2024-05-20 14:30:00,123 - CGLogger - INFO - start logging 2024-05-20 14:30:01,456 - CGLogger - INFO - blah
额外说明
- 调试pytest时,pytest默认会捕获控制台日志,但上述配置的日志会直接写入文件,不受捕获影响。如果需要在控制台查看日志,可以添加一个
StreamHandler到Logger中。 - 使用命名Logger(如
"CGLogger")能确保你的模块日志与其他模块/库的日志隔离,避免配置冲突。
内容的提问来源于stack exchange,提问作者Xavier Fornari
相关产品推荐
相关产品推荐

