在logging.json定义记录器配置的文件中,我定义了一个记录器script_logger,其中的处理程序console设置为将每个日志消息输出到标准输出。这是"propagate": "no"因为我不希望事件传播到根记录器,但是当我创建日志消息时,它无论如何都会在标准输出上显示两次。
避免出现两次消息的唯一方法是console从root记录器中删除处理程序。该propagate属性似乎没有任何作用。
为什么?有人可以帮忙吗?
$ python test_script.py
2015-09-02 14:26:35,436 - script_logger - DEBUG - debug msg
2015-09-02 14:26:35,436 - script_logger - DEBUG - debug msg
Run Code Online (Sandbox Code Playgroud)
测试脚本.py
import logging
if __name__ == "__main__":
logger = logging.getLogger("script_logger")
logger.debug("debug msg")
Run Code Online (Sandbox Code Playgroud)
日志记录.json
{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"simple": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "simple",
"stream": "ext://sys.stdout"
},
"info_file_handler": {
"class": "logging.handlers.RotatingFileHandler",
"level": "INFO",
"formatter": "simple",
"filename": "info.log",
"maxBytes": 10485760,
"backupCount": 20,
"encoding": "utf8"
},
"error_file_handler": {
"class": "logging.handlers.RotatingFileHandler",
"level": "ERROR",
"formatter": "simple",
"filename": "errors.log",
"maxBytes": 10485760,
"backupCount": 20,
"encoding": "utf8"
}
},
"loggers": {
"script_logger": {
"level": "DEBUG",
"handlers": ["console"],
"propagate": "no"
}
},
"root": {
"level": "DEBUG",
"handlers": ["console", "info_file_handler", "error_file_handler"]
}
}
Run Code Online (Sandbox Code Playgroud)
该消息被记录两次,因为console记录器同时位于root和script_logger- 但我认为您已经知道这一点。
只需替换"propagate": "no"为"propagate": False,一切都会按您的预期工作。