你正在看到那些[root]
信息和调试消息,因为您调用logging.basicConfig
创建一个根Handler具有水平NOTSET
。处理程序级别为NOTSET
将输出它收到的任何消息(参见处理程序.setLevel https://docs.python.org/3.5/library/logging.html#logging.Handler.setLevel).
>>> import logging
>>> logging.basicConfig(level=logging.WARN, format='[root] %(levelname)s - %(message)s')
>>> [handler.level == logging.NOTSET for handler in logging.getLogger().handlers]
[True]
这与您的第一个示例不同,因为在您的第一个示例中,您正在创建一个级别为WARN
.
The level=
参数为logging.basicConfig
用于设置根的级别Logger没有任何根Handler.
日志消息传播
日志消息向上传播到父 Logger,但不考虑任何父 Logger 的级别。这是任何水平Handlers这决定了“输出”什么。
从文档中日志记录器传播 https://docs.python.org/3.5/library/logging.html#logging.Logger.propagate:
消息直接传递到祖先记录器的处理程序 - 不考虑相关祖先记录器的级别或过滤器。
那么 Logger.level 是做什么用的呢?
记录器使用其级别来决定是否将消息传播到其以及任何父记录器的处理程序。
如果 Logger 没有设置级别,那么它会向其祖先 Logger 询问其级别并使用该级别(请参阅logging.Logger.setLevel https://docs.python.org/3.5/library/logging.html#logging.Logger.setLevel).
因此,仅当您未在子记录器上设置级别时,根记录器的级别才相关。