Python 通过stderr临时捕获日志输出
我有一堆单元测试,其中一个我想捕获将输出记录到变量中的内容(这意味着运行测试的人不应该看到)。在开始考虑这样做之前,我一直在尝试让一个简单的测试用例工作:Python 通过stderr临时捕获日志输出,python,unit-testing,logging,Python,Unit Testing,Logging,我有一堆单元测试,其中一个我想捕获将输出记录到变量中的内容(这意味着运行测试的人不应该看到)。在开始考虑这样做之前,我一直在尝试让一个简单的测试用例工作: import logging import sys from cStringIO import StringIO logging.basicConfig(stream=sys.stderr) logger = logging.getLogger(__name__) class Abc(): @staticmethod
import logging
import sys
from cStringIO import StringIO
logging.basicConfig(stream=sys.stderr)
logger = logging.getLogger(__name__)
class Abc():
@staticmethod
def pr():
logger.setLevel("WARN")
old_stderr = sys.stderr
sys.stderr = mystderr = StringIO()
logger.warn('bla bla bla')
sys.stderr = old_stderr
print mystderr.getvalue()
if __name__ == '__main__':
Abc.pr()
但事实并非如此。它输出:
WARNING:__main__:bla bla bla
(empty line from print)
我做错了什么?
sys.stderr
是指向对象的指针。因此,第一次调用logging.basicConfig(stream=sys.stderr)
将把记录器的流设置为有效流
稍后更改为sys.stderr
只会更改sys.stderr
指向的内容,而不会更改记录器中的流
我建议如下:
@staticmethod
def pr():
logger.setLevel("WARN")
mystderr = StringIO()
logging.basicConfig(stream=mystderr)
logger.warn('bla bla bla')
print 'my [ {} ]'.format(mystderr.getvalue())
logging.basicConfig(stream=sys.stderr)
真不敢相信我竟然没有意识到。最重要的是,如果我做得正确,我甚至不会知道,因为输出看起来是一样的。谢谢!