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

big*_*oud 4 python logging json python-3.x

我一直在尝试实现一个基本的记录器,它在 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

当运行时python3 logger.py产生输出(在终端中);

30
WARNING:root:Test warning message
ERROR:root:Test error message
CRITICAL:root:Test critical message
Run Code Online (Sandbox Code Playgroud)

第一的; 查看Python 的日志记录级别。30 是“警告”的默认日志记录级别。这与level我在处理程序和根记录器中设置的两个属性的设置相矛盾。JSON 似乎不正确,或者我错过了应用它的函数调用。

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

此外; 当我尝试使用配置文件格式时,它按我的想法工作。即;使用一个函数调用加载文件并能够立即进行日志记录调用。这令人困惑,因为为什么与 JSON 或 YAMLfileConfig()相比dictConfig(),与此格式一起使用的旧调用会提供更简化的功能?

最终,我有点困惑,想弄清楚这一点。我感谢您的时间和帮助。

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

"console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "stream": "ext://sys.stdout"
        },
Run Code Online (Sandbox Code Playgroud)

查看输出,和上面一样。

big*_*oud 6

啊,我明白出了什么问题。原来是 JSON。从我作为工作基础的这个例子来看,它logging在 JSON 中有一个额外的属性,它封装了所有的记录器、处理程序等。

删除该属性并使层次结构更像一个 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"
    }
}
Run Code Online (Sandbox Code Playgroud)