2016-08-30 74 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,然後你會看到實時的信息級別的消息。如果測試失敗,日誌插件將顯示失敗測試的所有日誌消息(包括調試)。您還將獲得文件副本(實時)。

相關問題