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

Python使用JSON配置logging时日志重复打印问题求助

Python logging重复打印问题:JSON配置导致日志多次输出的解决办法

我来帮你分析下这个日志重复打印的问题,核心原因是logging模块的日志传播机制加上你当前的JSON配置导致的。

问题根源

你的JSON配置里,同时给三个logger(spam_application.auxiliary.Auxiliary、spam_application.auxiliary和root)都绑定了同一个debug_file_handler。而logging的默认行为是:子logger的日志会向上传播到它的父logger,直到root logger。也就是说,当spam_application.auxiliary.Auxiliary的logger输出日志时,这条日志会:

  1. 被自身的handler处理一次
  2. 传播到父loggerspam_application.auxiliary,被它的handler再处理一次
  3. 继续传播到root logger,被root的handler处理第三次
    这就是你看到日志重复3次的直接原因。

解决方案

这里提供两种常用的解决思路,你可以根据自己的需求选择:

方案一:阻止日志向上传播(适合需要独立控制子logger的场景)

给配置里的非root logger加上"propagate": false,这样它们的日志就不会向上传递到父logger,每个logger的日志只会被自身的handler处理一次。

修改后的JSON配置:

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "simple": {
      "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    }
  },
  "handlers": {
    "debug_file_handler": {
      "class": "logging.FileHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "filename": "debug.log",
      "encoding": "utf8"
    }
  },
  "loggers": {
    "spam_application.auxiliary.Auxiliary": {
      "level": "DEBUG",
      "handlers": ["debug_file_handler"],
      "propagate": false
    },
    "spam_application.auxiliary": {
      "level": "DEBUG",
      "handlers": ["debug_file_handler"],
      "propagate": false
    }
  },
  "root": {
    "level": "DEBUG",
    "handlers": ["debug_file_handler"]
  }
}

方案二:利用logger继承性(更简洁的常规配置)

其实不需要给每个子logger都配置handler,只需要在root(或某个父级logger)上配置handler,子logger仅设置日志级别即可。这样子logger的日志会自动向上传播到父级的handler处理,既简洁又不会重复。

修改后的JSON配置:

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "simple": {
      "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    }
  },
  "handlers": {
    "debug_file_handler": {
      "class": "logging.FileHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "filename": "debug.log",
      "encoding": "utf8"
    }
  },
  "loggers": {
    "spam_application.auxiliary.Auxiliary": {
      "level": "DEBUG"
    },
    "spam_application.auxiliary": {
      "level": "DEBUG"
    }
  },
  "root": {
    "level": "DEBUG",
    "handlers": ["debug_file_handler"]
  }
}

额外代码小提示

你的主文件代码里,import auxiliary_module后面缺少逗号,应该修正为:

import auxiliary_module
import os
import json
import logging.config

或者合并为一行(注意逗号分隔):

import auxiliary_module, os, json, logging.config

避免出现语法错误影响运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:27:46