使用dictConfig进行Python日志记录 - "无法找到处理程序"

时间:2015-10-13 23:35:15

标签: python python-2.7 logging

我正在尝试使用logging.config.dictConfig设置多个模块的日志记录。我可以看到来自__main__的日志记录,但无法看到我的模块的任何输出。我觉得我错过了一些非常基本的东西。

这是目录结构:

settings.json
main.py
a/
`---b.py
`---__init__.py

以下是settings.json

的内容
{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": {
        "simple": {
            "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        }
    },

    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "level": "INFO",
            "formatter": "simple",
            "stream": "ext://sys.stdout"
        }
    },

    "loggers": {
        "a.b": {
            "level": "ERROR",
            "handlers": ["console"],
            "propagate": "no"
        }
    },

    "root": {
        "level": "INFO",
        "handlers": ["console"]
    }
}

以下是main.py

import logging
import logging.config
import json

from a import b

if __name__ == "__main__":
    logger = logging.getLogger(__name__)
    with open("settings.json", "r") as log_settings:
        log_config = json.loads(log_settings.read())
        logging.config.dictConfig(log_config)
    logger.info("Hello from main!")

最后,这里是b.py

的内容
import logging

print "Name of module: {0}".format(__name__)
logger = logging.getLogger(__name__)
logger.warning("Test warning!")

运行时,我得到以下输出:

Name of module: a.b
No handlers could be found for logger "a.b"
2015-10-13 18:26:12,138 - __main__ - INFO - Hello from main!

为什么没有为a.b找到处理程序?我在settings.json

中指定了它

1 个答案:

答案 0 :(得分:1)

这是因为b.py中的代码会在您致电dictConfig()之前执行 - 它会在from a import b行执行。如果您将b.py中的内容移动到函数foo()中并在调用b.foo()后从主调用dictConfig(),则您不应该看到{ {1}}消息。你仍然不会看到“测试警告!”当然,因为您已将该记录器的级别设置为No handlers

另请注意,您已复制ERRORconsole记录器的root处理程序,因此您将在输出中看到a.b两次记录的消息。这是因为您已将“传播”设置为“否”,Python将其评估为a.b。为避免传播,请将其设置为JSON中的True(无引号),这将成为Python中的false