Python Logging日志输出格式不符合预期问题求助
Python Logging格式不符问题排查与修复
问题根源
- Root Logger默认配置干扰:Python logging模块的root logger会在首次输出日志时自动添加一个StreamHandler,使用包含时间、级别、Logger名称的默认格式。而自定义Logger默认开启
propagate属性(值为True),会将日志传递给root logger的handler,导致输出格式偏离预期。 - 日志传播未关闭:自定义Logger的日志会向上传递到root logger,可能触发默认handler的输出,覆盖自定义格式。
- 多Logger实例混淆:若
get_logger()依赖__name__生成Logger名称,不同模块调用时会生成不同Logger实例,部分实例可能未正确应用自定义Formatter。
修复方案
1. 关闭自定义Logger的传播属性
在get_logger()中添加logger.propagate = False,阻止日志传递到root logger,避免默认配置干扰:
import logging def get_logger(): logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 关闭日志向上传播,避免root logger处理 logger.propagate = False handler = logging.StreamHandler() formatter = logging.Formatter("%(levelname)s - %(message)s") handler.setFormatter(formatter) if not logger.hasHandlers(): logger.addHandler(handler) return logger
2. 排查并移除Root Logger的额外配置
检查项目中是否有其他代码(如run_ui()内部)调用了logging.basicConfig(),该方法会初始化root logger的handler,覆盖自定义配置。确保所有日志配置都通过get_logger()统一管理,避免直接操作root logger。
3. 统一Logger实例(可选)
如果希望全项目使用同一个Logger,可以将getLogger(__name__)改为固定名称,避免模块名称差异导致的多实例问题:
def get_logger(): # 使用固定名称创建Logger实例 logger = logging.getLogger("my_app") logger.setLevel(logging.DEBUG) logger.propagate = False handler = logging.StreamHandler() formatter = logging.Formatter("%(levelname)s - %(message)s") handler.setFormatter(formatter) if not logger.hasHandlers(): logger.addHandler(handler) return logger
预期输出
修改后运行代码,控制台将输出符合预期的格式:
DEBUG - Started DEBUG - Page 1 Initiated
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

