From 187069f446ddb7124e8cf1968114d82c051f97a4 Mon Sep 17 00:00:00 2001 From: Amin Farjadi Date: Tue, 3 Jun 2025 10:02:47 +0100 Subject: [PATCH 1/2] fix(logger): caplog working with parent Logger --- aws_lambda_powertools/logging/logger.py | 2 ++ .../required_dependencies/test_logger.py | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 9f9ca1baf54..d6da7e54f63 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -374,6 +374,8 @@ 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: + 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 From 8735b26b7ef912d3dc947b3afd700c703ca1028a Mon Sep 17 00:00:00 2001 From: Amin Farjadi Date: Sat, 21 Jun 2025 01:32:35 +0100 Subject: [PATCH 2/2] add comment --- aws_lambda_powertools/logging/logger.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index d6da7e54f63..154d8ee6353 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -374,6 +374,7 @@ 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