@@ -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