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

Python Logging日志输出格式不符合预期问题求助

Python Logging格式不符问题排查与修复

问题根源

  1. Root Logger默认配置干扰:Python logging模块的root logger会在首次输出日志时自动添加一个StreamHandler,使用包含时间、级别、Logger名称的默认格式。而自定义Logger默认开启propagate属性(值为True),会将日志传递给root logger的handler,导致输出格式偏离预期。
  2. 日志传播未关闭:自定义Logger的日志会向上传递到root logger,可能触发默认handler的输出,覆盖自定义格式。
  3. 多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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:43:21