即使 stdout 和 stderr 设置为 None,日志模块如何仍然输出?

问题描述 投票:0回答:1

这是一个简单的概念验证脚本

import logging


logging.basicConfig(level=logging.DEBUG)

logging.info('This is a test for info')
logging.error('This is a test for error')
print('This is a test for print')

sys.__stdout__ = None
sys.stdout = None

sys.__stderr__ = None
sys.stderr = None

logging.info('This is a test for info after setting stdout to None')
logging.error('This is a test for error after setting stderr to None')
print('This is a test for print after setting stdout to None')

输出为:

INFO:root:This is a test for info
ERROR:root:This is a test for error
This is a test for print
INFO:root:This is a test for info after setting stdout to None
ERROR:root:This is a test for error after setting stderr to None

正如您所看到的,将 stdout/stderr 设置为 None 后,

print
语句不会输出字符串。

但是日志模块如何仍然将字符串输出到终端,这背后有什么原因吗?

python python-3.x stdout stderr sys
1个回答
0
投票

logging
模块独立于
sys.stdout
sys.stderr
输出消息,这就是为什么即使将日志消息设置为
None
后仍然会出现。

默认情况下,日志记录使用自己的处理程序,因此要停止记录输出,您需要显式删除这些处理程序。

要停止记录消息,您需要删除日志记录处理程序。

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)
© www.soinside.com 2019 - 2024. All rights reserved.