@@ -242,10 +242,6 @@ def __init__(
242
242
buffer_config : LoggerBufferConfig | None = None ,
243
243
** kwargs ,
244
244
) -> None :
245
-
246
- # Used in case of sampling
247
- self .initial_log_level = self ._determine_log_level (level )
248
-
249
245
self .service = resolve_env_var_choice (
250
246
choice = service ,
251
247
env = os .getenv (constants .SERVICE_NAME_ENV , "service_undefined" ),
@@ -285,6 +281,9 @@ def __init__(
285
281
if self ._buffer_config :
286
282
self ._buffer_cache = LoggerBufferCache (max_size_bytes = self ._buffer_config .max_bytes )
287
283
284
+ # Used in case of sampling
285
+ self .initial_log_level = self ._determine_log_level (level )
286
+
288
287
self ._init_logger (
289
288
formatter_options = formatter_options ,
290
289
log_level = level ,
@@ -1047,6 +1046,20 @@ def _determine_log_level(self, level: str | int | None) -> str | int:
1047
1046
stacklevel = 2 ,
1048
1047
)
1049
1048
1049
+ # Check if buffer level is less verbose than ALC
1050
+ if (
1051
+ hasattr (self , "_buffer_config" )
1052
+ and self ._buffer_config
1053
+ and logging .getLevelName (lambda_log_level )
1054
+ > logging .getLevelName (self ._buffer_config .buffer_at_verbosity )
1055
+ ):
1056
+ warnings .warn (
1057
+ "Advanced Logging Controls (ALC) Log Level is less verbose than Log Buffering Log Level. "
1058
+ "Buffered logs will be filtered by ALC" ,
1059
+ PowertoolsUserWarning ,
1060
+ stacklevel = 2 ,
1061
+ )
1062
+
1050
1063
# AWS Lambda Advanced Logging Controls takes precedence over Powertools log level and we use this
1051
1064
if lambda_log_level :
1052
1065
return lambda_log_level
@@ -1133,6 +1146,7 @@ def _add_log_record_to_buffer(
1133
1146
Handles special first invocation buffering and migration of log records
1134
1147
between different tracer contexts.
1135
1148
"""
1149
+
1136
1150
# Determine tracer ID, defaulting to first invoke marker
1137
1151
tracer_id = get_tracer_id ()
1138
1152
@@ -1180,6 +1194,7 @@ def flush_buffer(self) -> None:
1180
1194
Any exceptions from underlying logging or buffer mechanisms
1181
1195
will be propagated to caller
1182
1196
"""
1197
+
1183
1198
tracer_id = get_tracer_id ()
1184
1199
1185
1200
# Flushing log without a tracer id? Return
@@ -1190,6 +1205,21 @@ def flush_buffer(self) -> None:
1190
1205
buffer = self ._buffer_cache .get (tracer_id )
1191
1206
if not buffer :
1192
1207
return
1208
+
1209
+ if not self ._buffer_config :
1210
+ return
1211
+
1212
+ # Check ALC level against buffer level
1213
+ lambda_log_level = self ._get_aws_lambda_log_level ()
1214
+ if lambda_log_level :
1215
+ # Check if buffer level is less verbose than ALC
1216
+ if (logging .getLevelName (lambda_log_level ) > logging .getLevelName (self ._buffer_config .buffer_at_verbosity )):
1217
+ warnings .warn (
1218
+ "Advanced Logging Controls (ALC) Log Level is less verbose than Log Buffering Log Level. "
1219
+ "Some logs might be missing" ,
1220
+ PowertoolsUserWarning ,
1221
+ stacklevel = 2 ,
1222
+ )
1193
1223
1194
1224
# Process log records
1195
1225
for log_line in buffer :
0 commit comments