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

时间:2016-07-12 08:38:00

标签: python json python-3.x logging

我一直在尝试实现一个基本的记录器,该记录器在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"
        },

检查输出,与上面相同。

1 个答案:

答案 0 :(得分:2)

啊,我弄清楚出了什么问题。原来它是JSON。 从我基于我的工作的this example开始,它在JSON中有一个额外的logging属性,它封装了所有记录器,处理程序等。

删除该属性并使层次结构更像YAML文件(我也测试过,并且正常工作),它按预期工作。我甚至可以删除basicConfiglogger.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"
    }
}