Skip to content

Commit 51ee897

Browse files
author
Michal Ploski
committed
Ensure external loggers doesnt propagate logs
1 parent eee0acc commit 51ee897

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

Diff for: aws_lambda_powertools/logging/utils.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def copy_config_to_registered_loggers(
2424
exclude : Optional[Set[str]], optional
2525
List of logger names to exclude, by default None
2626
"""
27-
27+
package_logger = logging.getLogger("aws_lambda_powertools")
2828
level = log_level or source_logger.level
2929

3030
# Assumptions: Only take parent loggers not children (dot notation rule)
@@ -34,11 +34,11 @@ def copy_config_to_registered_loggers(
3434
# 3. Include and exclude set? Add Logger if it’s in include and not in exclude
3535
# 4. Only exclude set? Ignore Logger in the excluding list
3636

37-
# Exclude source logger by default
37+
# Exclude source and powertools package logger by default
3838
if exclude:
39-
exclude.add(source_logger.name)
39+
exclude.update(source_logger.name, package_logger.name)
4040
else:
41-
exclude = {source_logger.name}
41+
exclude = {source_logger.name, package_logger.name}
4242

4343
# Prepare loggers set
4444
if include:
@@ -75,6 +75,7 @@ def _find_registered_loggers(
7575
def _configure_logger(source_logger: Logger, logger: logging.Logger, level: Union[int, str]) -> None:
7676
logger.handlers = []
7777
logger.setLevel(level)
78+
logger.propagate = False
7879
source_logger.debug(f"Logger {logger} reconfigured to use logging level {level}")
7980
for source_handler in source_logger.handlers:
8081
logger.addHandler(source_handler)

Diff for: tests/functional/test_logger_utils.py

+27-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ def test_copy_config_to_ext_loggers_custom_log_level(stdout, logger, log_level):
184184
assert log["level"] == log_level.WARNING.name
185185

186186

187-
def test_copy_config_to_ext_loggers_should_not_break_append_keys(stdout, logger, log_level):
187+
def test_copy_config_to_ext_loggers_should_not_break_append_keys(stdout, log_level):
188188
# GIVEN powertools logger initialized
189189
powertools_logger = Logger(service=service_name(), level=log_level.INFO.value, stream=stdout)
190190

@@ -193,3 +193,29 @@ def test_copy_config_to_ext_loggers_should_not_break_append_keys(stdout, logger,
193193

194194
# THEN append_keys should not raise an exception
195195
powertools_logger.append_keys(key="value")
196+
197+
198+
def test_copy_config_to_ext_loggers_no_duplicate_logs(stdout, logger, log_level):
199+
# GIVEN an root logger, external logger and powertools logger initialized
200+
201+
root_logger = logging.getLogger()
202+
handler = logging.StreamHandler(stdout)
203+
formatter = logging.Formatter('{"message": "%(message)s"}')
204+
handler.setFormatter(formatter)
205+
root_logger.handlers = [handler]
206+
207+
logger = logger()
208+
209+
powertools_logger = Logger(service=service_name(), level=log_level.CRITICAL.value, stream=stdout)
210+
level = log_level.WARNING.name
211+
212+
# WHEN configuration copied from powertools logger
213+
# AND external logger used with custom log_level
214+
utils.copy_config_to_registered_loggers(source_logger=powertools_logger, include={logger.name}, log_level=level)
215+
msg = "test message4"
216+
logger.warning(msg)
217+
218+
# THEN no root logger logs AND log is not duplicated
219+
logs = capture_multiple_logging_statements_output(stdout)
220+
assert not {"message": msg} in logs
221+
assert sum(msg in log.values() for log in logs) == 1

0 commit comments

Comments
 (0)