我为什么在python中收不到日志信息(INFO级别)?

4

我正在使用命令行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()    

我希望在控制台上看到所有四个日志消息,但是我只看到了警告。发生了什么?我有什么误解吗?
EDIT:
通过在脚本开头添加 logging.basicConfig(),我发现可以得到预期的输出。这很奇怪,因为 Python 的日志记录文档中指出:
“如果未为根记录器定义处理程序,则函数 debug()、info()、warning()、error() 和 critical() 将自动调用 basicConfig()。”

你有哪些处理程序已经附加?如果我没记错的话,处理程序也可以按日志级别进行过滤。 - Silas Ray
上面的代码是唯一运行的代码,所以我猜没有其他的。不过请看我的编辑。 - Retsam
只是提醒一下,您知道严格来说,您的“rootLogger”并不是真正的根记录器,对吧? - Silas Ray
是的,我意识到我的命名约定在Python方面有点不准确,但对于我的测试来说已经足够了。 - Retsam
2个回答

4

好的,我研究了日志模块中的代码,并且我认为我至少部分地理解了它。你看到的情况是因为你所调用的rootLogger实际上并不是根记录器。如果在你直接调用logging的其中一个日志方法时,根记录器(真正的根记录器)没有添加处理程序,它会调用basicConfig,但是像你在这里做的那样,在Logger实例上调用日志方法实际上根本没有调用basicConfig。但是在这种情况下,这实际上是无关紧要的。 :) 我不确定此处调用的处理程序是在哪里创建的,但我几乎可以保证它已经附加到了真正的根记录器上。真正的根记录器默认初始化为WARNING。尝试执行logging.root.setLevel(logging.INFO),看看是否得到预期结果。如果手动将记录器附加到rootLogger,你也应该看到你想要的结果。


3
您所引用的手册部分位于“模块级函数”下,仅适用于模块函数。请参考Python日志库官方文档了解更多信息。
 logging.debug()

这里实际上是在调用一个实例方法,它被称为rootLog.info()。由于您正在使用该实例方法,因此并未为您调用basicConfig方法,您可能会与空记录器交互。文档解释有些混乱。

使用logging.basicConfig() 方法,应该可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接