Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python日志记录只在首先添加处理程序时隐藏标准输出?_Python_Python 2.7_Logging - Fatal编程技术网

为什么Python日志记录只在首先添加处理程序时隐藏标准输出?

为什么Python日志记录只在首先添加处理程序时隐藏标准输出?,python,python-2.7,logging,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") 但若我们首先调用日志记录,

如果我们在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")

这是为什么?

如果您自己不指定处理程序,每当您进行日志调用时,Python都会添加一个
StreamHandler
。这大概是为了防止在有人使用开箱即用的日志模块时出现混淆

这就是为什么在第二个示例中,您有一个与根记录器关联的
StreamHandler
NullHandler
。通过查看
.handlers
,您可以看到这一点:

>>> rootLogger.handlers
[<logging.StreamHandler object at 0x1022a0650>, <logging.NullHandler object at 0x1022a0790>]
>>rootLogger.handlers
[, ]
因此,添加的
NullHandler
将不会执行任何操作,而另一个
StreamHandler
将执行某些操作,这就是您看到这两条日志消息的原因。在第一个示例中,您自己添加了一个处理程序,因此只有一个处理程序,
NullHandler
,Python不需要自己添加处理程序