簡體   English   中英

pytest日志記錄到文件和標准輸出

[英]pytest logbook logging to file and stdout

我正在嘗試在PyTest測試中設置logbook ,將所有內容輸出到stderr和文件。 該文件應該獲得每個日志級別,但是stderr應該具有更高的閾值(PyTest將使用它通常的捕獲設置來管理)。

我有pytest-logbook插件。 這會將stderr重定向到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

回答我自己的問題(如果其他人遇到同樣的事情)。

日志處理程序形成一個堆棧,您必須允許消息“冒泡”。 這是在創建處理程序時作為選項完成的。

所以處理程序的創建應該是:

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

如果你運行py.test -s ,那么你將實時看到信息級別的消息。 如果測試失敗,日志插件將顯示失敗測試(包括調試)的所有日志消息。 您還將在文件中(實時)獲得一份副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM