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

Python自定义logger日志重复输出问题求助

问题描述
  • 我正在使用两个logger:默认(root)logger和一个自定义logger。
  • 发送给自定义logger的消息会重复出现,不知道原因。

测试代码

import json
import logging
import logging.config

with open("logging.json") as fl:
    logging.config.dictConfig(
        json.load(fl)
    )

# 默认(root)logger
logging.info("where is my stuff ?")

# 自定义(analyzer)logger
# 这条日志会重复出现
logging.getLogger("analyzer").info(
    "it is right there"
)

实际输出

[ 24/07/22 ( 08:56:26 ) ] [INFO] where is my stuff ?
{
    "time": "24/07/22 ( 08:56:26 )",
    "level": "INFO",
    "message": "it is right there"
}
[ 24/07/22 ( 08:56:26 ) ] [INFO] it is right there # <--- 为什么会这样?!

日志配置文件(logging.json)

{
    "version": 1,
    "formatters": {
        "formatter_default": {
            "format": "[ %(asctime)s ] [%(levelname)s] %(message)s",
            "datefmt": "%d/%m/%y ( %H:%M:%S )"
        },
        "formatter_analyzer": {
            "()": "pythonjsonlogger.jsonlogger.JsonFormatter",
            "format": "[ %(asctime)s ] %(levelname)s %(message)s",
            "datefmt": "%d/%m/%y ( %H:%M:%S )",
            "rename_fields": {
                "asctime": "time",
                "levelname": "level"
            },
            "json_indent": 4
        }

    },
    "handlers": { 
        "handler_default": { 
            "formatter": "formatter_default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout"
        },
        "handler_analyzer": { 
            "formatter": "formatter_analyzer",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout"
        }

    },
    "loggers": { 
        "root": {
            "handlers": ["handler_default"],
            "level": "INFO"
        },
        "analyzer": { 
            "handlers": ["handler_analyzer"],
            "level": "INFO"
        }
    }
}

问题原因及解决方法

原因

Python日志模块中,子logger默认会将日志传播到父logger。analyzer logger是root logger的子级,所以给analyzer发日志时,会先通过自身配置的handler_analyzer输出JSON格式日志,然后日志自动传播到root logger,再通过root的handler_default输出一次普通格式的日志,最终导致重复。

解决方法

在logging.json的analyzer logger配置中添加"propagate": false,关闭日志传播功能即可。

修改后的loggers部分配置如下:

"loggers": { 
    "root": {
        "handlers": ["handler_default"],
        "level": "INFO"
    },
    "analyzer": { 
        "handlers": ["handler_analyzer"],
        "level": "INFO",
        "propagate": false  // 新增这一行,关闭传播
    }
}

修改后的输出

调整配置后,运行代码会得到如下输出,日志不再重复:

[ 24/07/22 ( 08:56:26 ) ] [INFO] where is my stuff ?
{
    "time": "24/07/22 ( 08:56:26 )",
    "level": "INFO",
    "message": "it is right there"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:06:29