pytest-catchlog icon indicating copy to clipboard operation
pytest-catchlog copied to clipboard

caplog.set_level has side effects if logger name is passed explicitly

Open chekunkov opened this issue 7 years ago • 2 comments

If I pass logger name to caplog.set_level like this

caplog.set_level(logging.ERROR, logger='package.utils')

then for all following test cases that logger will have level set to ERROR, which is not expected.

chekunkov avatar Mar 31 '17 12:03 chekunkov

I've fixed that with the following custom fixture, please let me know if it worth a PR

import logging
from pytest_catchlog import LogCaptureFixture


class CustomLogCaptureFixture(LogCaptureFixture):

    def __init__(self, item, monkeypatch):
        super().__init__(item)
        self._monkeypatch = monkeypatch

    def set_level(self, level, logger=None):
        obj = logger and logging.getLogger(logger) or self.handler
        self._monkeypatch.setattr(obj, 'level', logging._checkLevel(level))


@pytest.fixture()
def caplog(request, monkeypatch):
    """Custom caplog fixture that fixes set_level side effects"""
    return CustomLogCaptureFixture(request.node, monkeypatch)

chekunkov avatar Mar 31 '17 13:03 chekunkov

@chekunkov Looks good at the first glance, thank you!

abusalimov avatar Mar 31 '17 14:03 abusalimov