Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/_pytest/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -585,11 +585,14 @@ def filtering(self, filter_: logging.Filter) -> Generator[None]:

.. versionadded:: 7.5
"""
self.handler.addFilter(filter_)
filter_was_present = filter_ in self.handler.filters
if not filter_was_present:
self.handler.addFilter(filter_)
try:
yield
finally:
self.handler.removeFilter(filter_)
if not filter_was_present:
self.handler.removeFilter(filter_)


@fixture
Expand Down
19 changes: 19 additions & 0 deletions testing/logging/test_fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,25 @@ def filter(self, record: logging.LogRecord) -> bool:
assert unfiltered_tuple == ("test_fixture", 20, "handler call")


def test_with_statement_filtering_nested_same_filter(
caplog: pytest.LogCaptureFixture,
) -> None:
class NoCaptureFilter(logging.Filter):
def filter(self, _record: logging.LogRecord) -> bool:
return False

filter_obj = NoCaptureFilter()

with caplog.at_level(logging.INFO):
with caplog.filtering(filter_obj):
logger.info("Will not be captured")
with caplog.filtering(filter_obj):
logger.info("Will also not be captured")
logger.info("Will still not be captured")

assert caplog.records == []


@pytest.mark.parametrize(
"level_str,expected_disable_level",
[
Expand Down