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
相关产品推荐
相关产品推荐

