所以我从命令行python运行以下代码:
import logging
rootLog = logging.getLogger(__name__)
rootLog.setLevel(logging.INFO)
rootLog.warning("This is a root warning")
rootLog.info("This is root info")
def info():
log = rootLog.getChild("info")
log.info("This is info")
log.warning("This is a warning")
info()
我期待在控制台上看到所有四条日志消息,但我只看到警告。到底是怎么回事?我误会了什么吗?
编辑:
我通过在脚本开头添加logging.basicConfig()来发现我将得到我期望的输出。这很奇怪,因为有关日志记录的python文档说明:
如果没有为根定义处理程序,则
debug()
,info()
,warning()
,error()
和critical()
函数会自动调用basicConfig()
记录器。
答案 0 :(得分:3)
好的,我在日志记录模块中挖掘了代码,我想我已经弄明白了,至少部分是这样。你所看到的正在发生,因为你所谓的rootLogger
实际上并不是根记录器。确实,如果在logging
上直接调用其中一个日志方法时没有向根记录器(真正的根记录器)添加处理程序,则会调用basicConfig
,但调用日志方法时您在此处执行的Logger
实例实际上根本不会调用basicConfig
。尽管如此,这在这种情况下实际上是无关紧要的。 :)我不确定在这里调用的处理程序在哪里创建,但我几乎可以保证它附加到真正的根记录器。默认情况下,真正的根记录器初始化为WARNING
。尝试logging.root.setLevel(logging.INFO)
,看看你是否得到了你的期望。如果手动将记录器附加到rootLogger
。
答案 1 :(得分:3)
您从手册中引用的位在Module-Level Functions下,仅在模块功能
时适用 logging.debug()
字面意思是。由于您正在使用rootLog.info()
调用实例方法,因此不会为您调用basicConfig,并且您可能正在与空记录器进行通信。文档在那里有点令人困惑。
使用loggging.basicConfig()
,事情应该有效。