【问题标题】:pytest logbook logging to file and stdoutpytest 日志记录到文件和标准输出
【发布时间】:2016-08-30 17:05:08
【问题描述】:

我正在尝试在 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

【问题讨论】:

    标签: python pytest logbook


    【解决方案1】:

    回答我自己的问题(以防其他人遇到同样的问题)。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2016-09-24
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多