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输出日志时,这条日志会:
- 被自身的handler处理一次
- 传播到父logger
spam_application.auxiliary,被它的handler再处理一次 - 继续传播到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
相关产品推荐
相关产品推荐

