Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 通过stderr临时捕获日志输出_Python_Unit Testing_Logging - Fatal编程技术网

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)

真不敢相信我竟然没有意识到。最重要的是,如果我做得正确,我甚至不会知道,因为输出看起来是一样的。谢谢!