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
相关产品推荐
相关产品推荐

