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

Python不同模块独立输出日志到指定文件的问题求解

问题原因

你遇到的问题核心来自三点:

  • logging.basicConfig是全局根日志配置,仅第一次调用会生效,后续调用直接被忽略。你运行module_b.py时先导入module_a,优先触发了module_a里的basicConfig,所以后续module_b的配置完全不生效
  • 你没有给每个模块的独立Logger单独绑定处理器,默认所有Logger都会继承根Logger的配置,所以所有日志都写到了第一个配置的a.log里
  • 额外注意你原有代码里level拼写错误,写成了levle,也会导致配置不生效
修复方案

不要在模块顶层使用全局basicConfig,给每个模块的独立Logger单独配置专属文件处理器,同时关闭日志向上传播,避免日志流向根Logger的处理器。

修改后的module_a.py

import logging

# 获取当前模块专属Logger
logger = logging.getLogger(__name__)
# 避免模块被多次导入时重复添加处理器
if not logger.handlers:
    # 设置日志级别
    logger.setLevel(logging.INFO)
    # 绑定专属文件处理器
    handler = logging.FileHandler("a.log")
    # 设置日志格式(可选,可自定义格式)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    # 关闭日志向上传播,不会流向根Logger
    logger.propagate = False

def function_a():
    logger.info("this is function a")

if __name__ == "__main__":
    logger.info("this is module a")
    function_a()

修改后的module_b.py

import logging
import module_a

# 获取当前模块专属Logger
logger = logging.getLogger(__name__)
if not logger.handlers:
    logger.setLevel(logging.INFO)
    handler = logging.FileHandler("b.log")
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.propagate = False

def function_b():
    module_a.function_a()
    logger.info("this is function b")

if __name__ == "__main__":
    logger.info("this is module b")
    function_b()
效果验证
  • 运行python3 module_a.py:所有module_a的日志写入a.log
  • 运行python3 module_b.py:module_a.function_a的日志写入a.log,module_b自身的日志写入b.log,完全符合需求

内容的提问来源于stack exchange,提问作者Free P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:24:05