Python多模块共享日志器无输出,遗漏了什么配置?
问题分析与解决方法
核心原因:代码执行顺序导致日志未被正确配置
- 你的主代码中,
from mf import gameplay语句在if __name__ == "__main__"代码块之前执行。导入gameplay模块时,模块内的logger.info("test module")会立刻运行,但此时__main__对应的日志器还未完成级别设置、文件处理器添加等配置——这些逻辑都在if __name__ == "__main__"块里,还没执行。 - Python默认日志级别为
WARNING,未配置的日志器会继承这个级别,因此INFO级别的日志会被直接过滤,不会输出到文件。
解决步骤
1. 调整日志配置位置,提前到模块导入前
将日志配置逻辑从if __name__ == "__main__"块中移出,放到模块最顶部(导入gameplay之前),确保模块导入时日志已完成配置:
import logging # 先完成日志配置 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.FileHandler('example.log') handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(worker)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) # 再导入模块 from mf import gameplay if __name__ == "__main__": logger.info("Querying database for docs...", extra={'worker': 'id_1'})
2. 修复模块日志的extra参数缺失问题
你的日志格式中使用了%(worker)s字段,gameplay模块的日志调用未传入该参数会触发报错,需要修改模块代码:
import logging logger = logging.getLogger("__main__") logger.info("test module", extra={'worker': 'module'})
3. 更规范的日志器命名(可选)
建议模块使用自身名称作为日志器名,而非直接使用__main__,这样日志结构更清晰,也能避免主模块名称变化带来的问题:
# gameplay模块中 import logging logger = logging.getLogger(__name__) # 用模块自身名称作为日志器标识 logger.info("test module", extra={'worker': 'module'}) # 主模块中配置根日志器,让所有子日志器自动继承配置 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(worker)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('example.log')] )
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

