@@ -184,7 +184,7 @@ def test_copy_config_to_ext_loggers_custom_log_level(stdout, logger, log_level):
184
184
assert log ["level" ] == log_level .WARNING .name
185
185
186
186
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 ):
188
188
# GIVEN powertools logger initialized
189
189
powertools_logger = Logger (service = service_name (), level = log_level .INFO .value , stream = stdout )
190
190
@@ -193,3 +193,51 @@ def test_copy_config_to_ext_loggers_should_not_break_append_keys(stdout, logger,
193
193
194
194
# THEN append_keys should not raise an exception
195
195
powertools_logger .append_keys (key = "value" )
196
+
197
+
198
+ def test_copy_config_to_parent_loggers_only (stdout ):
199
+ # GIVEN Powertools Logger and Child Logger are initialized
200
+ # and Powertools Logger config is copied over
201
+ service = service_name ()
202
+ child = Logger (stream = stdout , service = service , child = True )
203
+ parent = Logger (stream = stdout , service = service )
204
+ utils .copy_config_to_registered_loggers (source_logger = parent )
205
+
206
+ # WHEN either parent or child logger append keys
207
+ child .append_keys (customer_id = "value" )
208
+ parent .append_keys (user_id = "value" )
209
+ parent .info ("Logger message" )
210
+ child .info ("Child logger message" )
211
+
212
+ # THEN both custom keys should be propagated bi-directionally in parent and child loggers
213
+ # as child logger won't be touched when config is being copied
214
+ parent_log , child_log = capture_multiple_logging_statements_output (stdout )
215
+ assert "customer_id" in parent_log , child_log
216
+ assert "user_id" in parent_log , child_log
217
+ assert child .parent .name == service
218
+
219
+
220
+ def test_copy_config_to_ext_loggers_no_duplicate_logs (stdout , logger , log_level ):
221
+ # GIVEN an root logger, external logger and powertools logger initialized
222
+
223
+ root_logger = logging .getLogger ()
224
+ handler = logging .StreamHandler (stdout )
225
+ formatter = logging .Formatter ('{"message": "%(message)s"}' )
226
+ handler .setFormatter (formatter )
227
+ root_logger .addHandler (handler )
228
+
229
+ logger = logger ()
230
+
231
+ powertools_logger = Logger (service = service_name (), level = log_level .CRITICAL .value , stream = stdout )
232
+ level = log_level .WARNING .name
233
+
234
+ # WHEN configuration copied from powertools logger
235
+ # AND external logger used with custom log_level
236
+ utils .copy_config_to_registered_loggers (source_logger = powertools_logger , include = {logger .name }, log_level = level )
237
+ msg = "test message4"
238
+ logger .warning (msg )
239
+
240
+ # THEN no root logger logs AND log is not duplicated
241
+ logs = capture_multiple_logging_statements_output (stdout )
242
+ assert {"message" : msg } not in logs
243
+ assert sum (msg in log .values () for log in logs ) == 1
0 commit comments