You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:53:12