diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 9f9ca1baf54..154d8ee6353 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -374,6 +374,9 @@ def _init_logger( if not self._is_deduplication_disabled: logger.debug("Adding filter in root logger to suppress child logger records to bubble up") for handler in logging.root.handlers: + # skip suppressing pytest's handler, allowing caplog fixture usage + if type(handler).__name__ == "LogCaptureHandler" and type(handler).__module__ == "_pytest.logging": + continue # It'll add a filter to suppress any child logger from self.service # Example: `Logger(service="order")`, where service is Order # It'll reject all loggers starting with `order` e.g. order.checkout, order.shared diff --git a/tests/functional/logger/required_dependencies/test_logger.py b/tests/functional/logger/required_dependencies/test_logger.py index e799dce9b60..2a960582e3f 100644 --- a/tests/functional/logger/required_dependencies/test_logger.py +++ b/tests/functional/logger/required_dependencies/test_logger.py @@ -15,6 +15,7 @@ from typing import TYPE_CHECKING, Any import pytest +from _pytest.logging import LogCaptureHandler from aws_lambda_powertools import Logger from aws_lambda_powertools.logging import correlation_paths @@ -1556,3 +1557,24 @@ def handler(event, context): # THEN we must be able to inject context log = capture_logging_output(stdout) assert request_id == log["correlation_id"] + + +def test_non_preconfigured_logger_with_caplog(caplog, service_name): + caplog.set_level("INFO") + logger = Logger(service=service_name) + logger.info("testing, testing...") + pytest_handler_existence = any(isinstance(item, LogCaptureHandler) for item in logger._logger.root.handlers) + + assert pytest_handler_existence is True + assert len(caplog.records) == 1 + assert caplog.records[0].message == "testing, testing..." + + +def test_child_logger_with_caplog(caplog): + caplog.set_level("INFO") + logger = Logger(child=True) + logger.info("testing, testing...") + pytest_handler_existence = any(isinstance(item, LogCaptureHandler) for item in logger._logger.root.handlers) + + assert len(caplog.records) == 1 + assert pytest_handler_existence is True