2016-08-30 3016 views
2

我试图在PyTest测试中设置logbook以将所有内容输出到stderr和一个文件。该文件应该获得每个日志级别,但stderr应该有一个更高的阈值(PyTest将使用它的通常捕获设置进行管理)。我有插件。这将stderr重定向到PyTest捕获,但我不知道如何添加文件输出。pytest日志记录到文件和标准输出

这对于懂日志的人来说(有希望)是显而易见的,但这对我来说是新的。

还有一件事,我希望文件记录是实时的。我的测试通常是长时间运行的,PyTest的仅在失败时显示输出的正常行为并不能帮助我在需要查看事件是否被挂起时。

这里是我认为应该工作的代码,但没有。我得到的日志文件,但没有到stdout/stderr(即使在失败):

conftest.py

import os 
import pytest 
import logbook 
import sys 

@pytest.fixture(scope='module') 
def modlog(request): 
    """Logger that also writes to a file.""" 
    name = request.module.__name__ 
    if name.startswith('test_'): 
     name = name[5:] 
    logname = 'TEST-'+name+'.log' 
    if os.path.exists(logname): 
     os.rename(logname, logname+"~") 
    logger = logbook.Logger(name) 
    logger.handlers.append(logbook.FileHandler(logname, level='DEBUG')) 
    logger.handlers.append(logbook.StreamHandler(sys.stdout, level='INFO')) 
    logger.warn("Start of logging") 
    return logger 

test_loggy.py

import pytest 

def test_foo(modlog): 
    modlog.info('hello') 
    modlog.info('world') 
    assert 0      # logs will only print on test fail 

回答

3

回答我的问题(如果其他碰上一样的东西)。

日志记录处理程序形成一个堆栈,你必须允许消息“冒泡”。这是在创建处理程序时作为选项完成的。

所以处理程序的创建应该是:

logger.handlers.append(logbook.FileHandler(logname, level='DEBUG', bubble=True)) 
logger.handlers.append(logbook.StreamHandler(sys.stderr, level='INFO', bubble=True)) 

如果运行py.test -s,然后你会看到实时的信息级别的消息。如果测试失败,日志插件将显示失败测试的所有日志消息(包括调试)。您还将获得文件副本(实时)。

相关问题