@@ -47,7 +47,9 @@ def capture_multiple_logging_statements_output(stdout):
47
47
48
48
49
49
@pytest .mark .parametrize ("log_level" , ["DEBUG" , "WARNING" , "INFO" ])
50
- def test_logger_buffer_with_minimum_level_warning (log_level , stdout , service_name ):
50
+ def test_logger_buffer_with_minimum_level_warning (log_level , stdout , service_name , monkeypatch ):
51
+
52
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f" )
51
53
52
54
# GIVEN A logger configured with a buffer and minimum log level set to WARNING
53
55
logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "WARNING" )
@@ -100,7 +102,7 @@ def test_logger_buffer_is_never_buffered_with_error(stdout, service_name):
100
102
101
103
@pytest .mark .parametrize ("log_level" , ["CRITICAL" , "ERROR" ])
102
104
def test_logger_buffer_is_flushed_when_an_error_happens (stdout , service_name , log_level , monkeypatch ):
103
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
105
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
104
106
105
107
# GIVEN A logger configured with buffer and automatic error-based flushing
106
108
logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" , flush_on_error = True )
@@ -129,7 +131,7 @@ def test_logger_buffer_is_flushed_when_an_error_happens(stdout, service_name, lo
129
131
130
132
@pytest .mark .parametrize ("log_level" , ["CRITICAL" , "ERROR" ])
131
133
def test_logger_buffer_is_not_flushed_when_an_error_happens (stdout , service_name , log_level , monkeypatch ):
132
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
134
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
133
135
134
136
# GIVEN A logger configured with a buffer and error flushing disabled
135
137
logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" , flush_on_error = False )
@@ -157,10 +159,10 @@ def test_logger_buffer_is_not_flushed_when_an_error_happens(stdout, service_name
157
159
158
160
159
161
def test_create_and_flush_logs (stdout , service_name , monkeypatch ):
160
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
162
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
161
163
162
164
# GIVEN A logger configured with a large buffer
163
- logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" , flush_on_error = True )
165
+ logger_buffer_config = LoggerBufferConfig (max_size = 10240 )
164
166
logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
165
167
166
168
# WHEN Logging a message and then flushing the buffer
@@ -172,12 +174,27 @@ def test_create_and_flush_logs(stdout, service_name, monkeypatch):
172
174
assert "this log line will be flushed" == log [0 ]["message" ]
173
175
174
176
177
+ def test_ensure_log_location_after_flush_buffer (stdout , service_name , monkeypatch ):
178
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f" )
179
+
180
+ # GIVEN A logger configured with a sufficiently large buffer
181
+ logger_buffer_config = LoggerBufferConfig (max_size = 10240 )
182
+ logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
183
+
184
+ # WHEN Logging a debug message and immediately flushing the buffer
185
+ logger .debug ("this log line will be flushed" )
186
+ logger .flush_buffer ()
187
+
188
+ # THEN Validate that the log location is precisely captured
189
+ log = capture_multiple_logging_statements_output (stdout )
190
+ assert "test_ensure_log_location_after_flush_buffer:184" in log [0 ]["location" ]
191
+
192
+
175
193
def test_create_buffer_with_items_evicted (stdout , service_name , monkeypatch ):
176
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
194
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
177
195
178
196
# GIVEN A logger configured with a 1024-byte buffer
179
197
logger_buffer_config = LoggerBufferConfig (max_size = 1024 , minimum_log_level = "DEBUG" )
180
-
181
198
logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
182
199
183
200
# WHEN Adding multiple log entries that exceed buffer size
@@ -193,11 +210,10 @@ def test_create_buffer_with_items_evicted(stdout, service_name, monkeypatch):
193
210
194
211
195
212
def test_create_buffer_with_items_evicted_with_next_invocation (stdout , service_name , monkeypatch ):
196
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
213
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
197
214
198
215
# GIVEN A logger configured with a 1024-byte buffer
199
216
logger_buffer_config = LoggerBufferConfig (max_size = 1024 , minimum_log_level = "DEBUG" )
200
-
201
217
logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
202
218
203
219
# WHEN Adding multiple log entries that exceed buffer size
@@ -224,7 +240,7 @@ def test_create_buffer_with_items_evicted_with_next_invocation(stdout, service_n
224
240
225
241
226
242
def test_flush_buffer_when_empty (stdout , service_name , monkeypatch ):
227
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
243
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
228
244
229
245
# GIVEN: A logger configured with a 1024-byte buffer
230
246
logger_buffer_config = LoggerBufferConfig (max_size = 1024 , minimum_log_level = "DEBUG" )
@@ -240,7 +256,7 @@ def test_flush_buffer_when_empty(stdout, service_name, monkeypatch):
240
256
241
257
242
258
def test_log_record_exceeding_buffer_size (stdout , service_name , monkeypatch ):
243
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
259
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
244
260
245
261
# GIVEN A logger configured with a small 10-byte buffer
246
262
logger_buffer_config = LoggerBufferConfig (max_size = 10 , minimum_log_level = "DEBUG" )
@@ -254,7 +270,9 @@ def test_log_record_exceeding_buffer_size(stdout, service_name, monkeypatch):
254
270
255
271
256
272
@pytest .mark .parametrize ("log_level" , ["WARNING" , "INFO" ])
257
- def test_logger_buffer_log_output_for_levels_above_minimum (log_level , stdout , service_name ):
273
+ def test_logger_buffer_log_output_for_levels_above_minimum (log_level , stdout , service_name , monkeypatch ):
274
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f" )
275
+
258
276
# GIVEN A logger configured with a buffer and minimum log level set to DEBUG
259
277
logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" )
260
278
logger = Logger (level = log_level , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
@@ -276,10 +294,10 @@ def test_logger_buffer_log_output_for_levels_above_minimum(log_level, stdout, se
276
294
277
295
278
296
def test_logger_buffer_flush_on_uncaught_exception (stdout , service_name , monkeypatch , lambda_context ):
279
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
297
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
280
298
281
299
# GIVEN: A logger configured with a large buffer and error-based flushing
282
- logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" , flush_on_error = True )
300
+ logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" )
283
301
logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
284
302
285
303
@logger .inject_lambda_context (flush_buffer_on_uncaught_error = True )
@@ -301,10 +319,10 @@ def handler(event, context):
301
319
302
320
303
321
def test_logger_buffer_not_flush_on_uncaught_exception (stdout , service_name , monkeypatch , lambda_context ):
304
- monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1234 " )
322
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f " )
305
323
306
324
# GIVEN: A logger configured with a large buffer and error-based flushing
307
- logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" , flush_on_error = True )
325
+ logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" )
308
326
logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
309
327
310
328
@logger .inject_lambda_context (flush_buffer_on_uncaught_error = False )
@@ -321,3 +339,50 @@ def handler(event, context):
321
339
# THEN Verify that buffered log messages are flushed before the exception
322
340
log = capture_multiple_logging_statements_output (stdout )
323
341
assert len (log ) == 0
342
+
343
+
344
+ def test_buffer_configuration_propagation_across_logger_instances (stdout , service_name , monkeypatch ):
345
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f" )
346
+
347
+ # GIVEN A logger configured with specific buffer settings
348
+ logger_buffer_config = LoggerBufferConfig (max_size = 10240 , minimum_log_level = "DEBUG" )
349
+
350
+ # Create primary logger with explicit buffer configuration
351
+ primary_logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
352
+
353
+ # Create secondary logger for the same service (should inherit buffer config)
354
+ secondary_logger = Logger (level = "DEBUG" , service = service_name )
355
+
356
+ # WHEN Logging messages and flushing the buffer
357
+ primary_logger .debug ("Log message from primary logger" )
358
+ secondary_logger .debug ("Log message from secondary logger" )
359
+ primary_logger .flush_buffer ()
360
+
361
+ # THEN Verify log messages are correctly captured and output
362
+ log = capture_multiple_logging_statements_output (stdout )
363
+
364
+ assert "Log message from primary logger" == log [0 ]["message" ]
365
+ assert "Log message from secondary logger" == log [1 ]["message" ]
366
+ assert primary_logger ._logger .powertools_buffer_config == secondary_logger ._logger .powertools_buffer_config
367
+
368
+
369
+ def test_logger_buffer_is_cleared_between_lambda_invocations (stdout , service_name , monkeypatch , lambda_context ):
370
+ # Set initial trace ID for first Lambda invocation
371
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "1-67c39786-5908a82a246fb67f3089263f" )
372
+
373
+ # GIVEN A logger configured with specific buffer parameters
374
+ logger_buffer_config = LoggerBufferConfig (max_size = 10240 )
375
+ logger = Logger (level = "DEBUG" , service = service_name , stream = stdout , logger_buffer = logger_buffer_config )
376
+
377
+ def handler (event , context ):
378
+ logger .debug ("debug line" )
379
+
380
+ # WHEN First Lambda invocation with initial trace ID
381
+ handler ({}, lambda_context )
382
+
383
+ # WHEN New Lambda invocation arrives with different trace ID
384
+ monkeypatch .setenv (constants .XRAY_TRACE_ID_ENV , "2-ABC39786-5908a82a246fb67f3089263f" )
385
+ handler ({}, lambda_context )
386
+
387
+ # THEN Verify buffer for the original trace ID is cleared
388
+ assert not logger .buffer_cache .get ("1-67c39786-5908a82a246fb67f3089263f" )
0 commit comments