我一直在尝试实现一个基本的记录器,该记录器在Python 3.5中写入文件,从JSON配置文件加载设置。 我会先显示我的代码;
log_config.json
{
"version": 1,
"disable_existing_loggers": "false",
"logging": {
"formatters": {
"basic": {
"class": "logging.Formatter",
"style": "%",
"datefmt": "%I:%M:%S",
"format": "[%(asctime)] %(levelname:<8s): (name:<4s): %(message)"
}
},
"handlers": {
"file": {
"class": "logging.handlers.FileHandler",
"level": "DEBUG",
"formatter": "basic",
"filename": "test.log",
"mode": "a",
"encoding": "utf-8"
}
},
"loggers": { },
"root": {
"handlers": ["file"],
"level": "DEBUG"
}
}
}
logger.py
import json
import logging
import logging.config
logging.basicConfig()
with open("log_config.json", "r") as fd:
logging.config.dictConfig(json.load(fd))
logger = logging.getLogger() # Returns the "root" logger
print(logger.getEffectiveLevel()) # Check what level of messages will be shown
logger.debug("Test debug message")
logger.info("Test info message")
logger.warn("Test warning message")
logger.error("Test error message")
logger.critical("Test critical message")
使用python3 logger.py
运行时会产生输出(在终端中);
30
WARNING:root:Test warning message
ERROR:root:Test error message
CRITICAL:root:Test critical message
首先;看 Python's logging levels。 30是&#39; WARNING&#39;的默认日志记录级别。这与我在处理程序和根记录器中设置的level
属性的设置相矛盾。似乎JSON不正确或者我错过了一个函数调用来应用它。
二; This thread让我觉得虽然我通过调用dictConfig()
来加载配置,但仍需要将其应用于日志记录,并在logger.py
文件中进一步调用。你有配置似乎有点多余,然后不得不详细地应用每个设置。
此外;当我尝试使用Configuration file format时,它按照我的想法工作。即;通过一个函数调用加载文件,并能够立即进行日志记录调用。这很令人困惑,因为使用这种格式的较旧的fileConfig()
调用提供了比使用JSON或YAML的dictConfig()
更简化的功能?
最终,我有点困惑,想知道这一点。感谢您的时间和帮助。
编辑:从Alex.P的评论中,我将以下处理程序添加到log_config.json
并将处理程序根目录更改为它。
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},
检查输出,与上面相同。
答案 0 :(得分:2)
logging
属性,它封装了所有记录器,处理程序等。
删除该属性并使层次结构更像YAML文件(我也测试过,并且正常工作),它按预期工作。我甚至可以删除basicConfig
中logger.py
的额外电话。
最终JSON;
{
"version": 1,
"disable_existing_loggers": "false",
"formatters": {
"basic": {
"class": "logging.Formatter",
"datefmt": "%I:%M:%S",
"format": "%(asctime)s %(levelname)s %(name)s %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},
"file": {
"class": "logging.FileHandler",
"level": "DEBUG",
"formatter": "basic",
"filename": "test.log",
"mode": "w",
"encoding": "utf-8"
}
},
"loggers": { },
"root": {
"handlers": ["console", "file"],
"level": "DEBUG"
}
}