【问题标题】:Logging with pytest.ini. How to append to the file?使用 pytest.ini 进行日志记录。如何附加到文件?
【发布时间】:2021-04-25 15:16:18
【问题描述】:

我正在尝试将日志记录添加到我的 pytest 测试中,一切都很好,除了每个其他测试运行的日志都会重新写入所有宝贵的信息。

这是我的 pytest.ini 文件:

log_file = my.log
log_file_level = DEBUG
log_file_format = %(levelname)s %(asctime)s - %(message)s (%(filename)s:%(lineno)s)
log_file_date_format=%Y-%m-%d %H:%M:%S

这是我的测试代码:

import os
class TestLog:
    def test_log_1(self):
        logging.info('everything is okay')
        output = 2
        assert output == 2, 'everything is okay'

    def test_log_2(self):
        output = 0
        logging.info(f'test params: {output}')
        try:
            assert output == 2, 'everything is okay'
        except AssertionError:
            logging.error(f"'everything is not okay'")
            raise AssertionError

我尝试添加logging.basicConfig(filemode = "a"),但没有任何帮助。

任何帮助将不胜感激

【问题讨论】:

    标签: python logging pytest


    【解决方案1】:

    引用pytest docs:

    此日志文件以写入模式打开,这意味着它将在每次运行测试会话时被覆盖。

    这意味着您不能通过配置强制执行附加模式; logging.basicConfig 在这里也无济于事,因为它在调用太晚时是一个 noop,或者它确实配置了日志记录,但稍后 pytest 仍然会忽略它并设置自己的处理程序。

    我看到的唯一选择是通过将新日志与前一个日志合并来管理自己的附加。在开始时备份my.log,在退出前将其与新的my.log 合并。将代码放在项目中conftest.py的文件中或测试根目录:

    import io
    import pathlib
    import os
    import shutil
    
    
    def pytest_configure(config):
        log_file = config.rootpath / config.getini("log_file")
        if log_file.is_file():
            config._backup = log_file.with_name(".log.bak")
            shutil.copy(log_file, config._backup)
    
    
    @pytest.hookimpl(trylast=True)
    def pytest_unconfigure(config):
        log_file = config.rootpath / config.getini("log_file")
        if log_file.is_file():
            log_backup = getattr(config, "_backup", None)
            if log_backup and log_backup.is_file():
                log_file.write_text(log_backup.read_text() + log_file.read_text())
                log_backup.unlink()
    

    另一个选项可能会弄乱pytest 内部结构,但由于该模式是硬编码的,因此实现会相当难看,例如猴子修补_pytest.logging._FileHandler 并强制执行附加模式。因此,我建议不要这样做。

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多