【问题标题】:Temporarily capturing logging output via stderr通过 stderr 临时捕获日志输出
【发布时间】:2017-02-16 16:07:07
【问题描述】:

我有一堆单元测试,其中一个我想将日志输出捕获到变量中(这意味着运行测试的人不应该看到它)。在我开始考虑这样做之前,我一直在尝试让一个简单的测试用例起作用:

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)

我做错了什么?

【问题讨论】:

    标签: python unit-testing logging


    【解决方案1】:

    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)
    

    【讨论】:

    • 不敢相信我没有意识到这一点。最重要的是,如果我做得正确,我什至都不知道,因为输出看起来是一样的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2017-11-24
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多