为什么Python日志记录仅在首先添加处理程序时隐藏stdout?

时间:2014-11-05 21:11:35

标签: python python-2.7 logging

如果我们在Python中将处理程序附加到根级别记录器,我们在控制台中看不到任何输出:

import logging, logging.handlers, os

rootLogger = logging.getLogger('')
rootLogger.setLevel(logging.DEBUG)
rootLogger.addHandler(logging.NullHandler())
logging.info("We don't see this comment")

但如果我们先调用日志记录,我们会在控制台中看到输出。我们甚至看到输出 之后我们添加了一个处理程序:

import logging, logging.handlers, os

rootLogger = logging.getLogger('')
rootLogger.setLevel(logging.DEBUG)
logging.info("We see this comment")
rootLogger.addHandler(logging.NullHandler())
logging.info("But we also see this comment")

为什么会这样?

1 个答案:

答案 0 :(得分:1)

如果您没有自己指定处理程序,那么只要您进行日志记录调用,Python就会添加StreamHandler。据推测,这是为了防止每当有人使用开箱即用的记录模块时出现混淆。

这就是为什么在第二个示例中,您拥有与根记录器关联的StreamHandlerNullHandler的原因。你可以通过查看.handlers

来看到这一点
>>> rootLogger.handlers
[<logging.StreamHandler object at 0x1022a0650>, <logging.NullHandler object at 0x1022a0790>]

因此添加的NullHandler不会做任何事情,其他StreamHandler会做一些事情,这就是为什么您会看到这两个记录消息的原因。在第一个示例中,您自己添加了一个处理程序,因此只有一个处理程序,NullHandler,并且Python不需要自己添加处理程序。