gpt4 book ai didi

python - Python 的 logging.config.dictConfig() 是否应用记录器的配置设置?

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:16 26 4
gpt4 key购买 nike

我一直在尝试实现一个基本的记录器,它写入 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 是“警告”的默认日志记录级别。这与我在处理程序和根记录器中设置的 level 属性的设置相矛盾。 JSON 似乎不正确,或者我错过了应用它的函数调用。

第二个; This thread让我觉得虽然我通过调用 dictConfig() 加载配置,但我仍然需要通过在我的 logger.py 文件中进一步调用将其应用于日志记录。拥有配置然后必须详细应用每个设置似乎有点多余。

此外;当我尝试使用 Configuration file format它像我想象的那样工作。即;使用一个函数调用加载文件并能够立即进行日志记录调用。这很令人困惑,因为为什么与使用 JSON 或 YAML 的 dictConfig() 相比,与此格式一起使用的较旧的 fileConfig() 调用会提供更精简的功能?

最终,我有点困惑,想弄清楚这一点。感谢您抽出时间提供帮助。

编辑:根据 Alex.P 的评论,我将以下处理程序添加到 log_config.json 并将处理程序的根更改为它。

"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},

查看输出,同上。

最佳答案

啊,我知道出了什么问题。原来是JSON。来自 this example这是我工作的基础,它在 JSON 中有一个额外的 logging 属性,它封装了所有记录器、处理程序等。

删除该属性并使层次结构更像一个 YAML 文件(我也对其进行了测试,并且可以正常工作),它按预期工作。我什至可以在我的 logger.py 中删除对 basicConfig 的额外调用。

最终 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"
}
}

关于python - Python 的 logging.config.dictConfig() 是否应用记录器的配置设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com