我正在尝试使用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
?
答案 0 :(得分:1)
这是因为b.py
中的代码会在您致电dictConfig()
之前执行 - 它会在from a import b
行执行。如果您将b.py
中的内容移动到函数foo()
中并在调用b.foo()
后从主调用dictConfig()
,则您不应该看到{ {1}}消息。你仍然不会看到“测试警告!”当然,因为您已将该记录器的级别设置为No handlers
。
另请注意,您已复制ERROR
和console
记录器的root
处理程序,因此您将在输出中看到a.b
两次记录的消息。这是因为您已将“传播”设置为“否”,Python将其评估为a.b
。为避免传播,请将其设置为JSON中的True
(无引号),这将成为Python中的false
。