为什么我没有在python中收到日志INFO消息?

时间:2012-08-04 02:02:59

标签: python logging command-line

所以我从命令行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()记录器。

2 个答案:

答案 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(),事情应该有效。