Skip to content

Commit 2c2d8e8

Browse files
fix(logger): warn customers when the ALC log level is less verbose than log buffer (#6509)
* fix(logger): warn customers when the ALC log level is less verbose than log buffer * change flush buffer warning * mypy * mypy * mypy * fix logger * change flush buffer warn * check buffer config --------- Co-authored-by: Leandro Damascena <[email protected]>
1 parent 2c4638b commit 2c2d8e8

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

aws_lambda_powertools/logging/logger.py

+34-4
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,6 @@ def __init__(
242242
buffer_config: LoggerBufferConfig | None = None,
243243
**kwargs,
244244
) -> None:
245-
246-
# Used in case of sampling
247-
self.initial_log_level = self._determine_log_level(level)
248-
249245
self.service = resolve_env_var_choice(
250246
choice=service,
251247
env=os.getenv(constants.SERVICE_NAME_ENV, "service_undefined"),
@@ -285,6 +281,9 @@ def __init__(
285281
if self._buffer_config:
286282
self._buffer_cache = LoggerBufferCache(max_size_bytes=self._buffer_config.max_bytes)
287283

284+
# Used in case of sampling
285+
self.initial_log_level = self._determine_log_level(level)
286+
288287
self._init_logger(
289288
formatter_options=formatter_options,
290289
log_level=level,
@@ -1047,6 +1046,20 @@ def _determine_log_level(self, level: str | int | None) -> str | int:
10471046
stacklevel=2,
10481047
)
10491048

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+
10501063
# AWS Lambda Advanced Logging Controls takes precedence over Powertools log level and we use this
10511064
if lambda_log_level:
10521065
return lambda_log_level
@@ -1133,6 +1146,7 @@ def _add_log_record_to_buffer(
11331146
Handles special first invocation buffering and migration of log records
11341147
between different tracer contexts.
11351148
"""
1149+
11361150
# Determine tracer ID, defaulting to first invoke marker
11371151
tracer_id = get_tracer_id()
11381152

@@ -1180,6 +1194,7 @@ def flush_buffer(self) -> None:
11801194
Any exceptions from underlying logging or buffer mechanisms
11811195
will be propagated to caller
11821196
"""
1197+
11831198
tracer_id = get_tracer_id()
11841199

11851200
# Flushing log without a tracer id? Return
@@ -1190,6 +1205,21 @@ def flush_buffer(self) -> None:
11901205
buffer = self._buffer_cache.get(tracer_id)
11911206
if not buffer:
11921207
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+
)
11931223

11941224
# Process log records
11951225
for log_line in buffer:

tests/functional/logger/required_dependencies/test_powertools_logger_buffer.py

+22
Original file line numberDiff line numberDiff line change
@@ -525,3 +525,25 @@ def handler(event, context):
525525

526526
# THEN Verify buffer for the original trace ID is cleared
527527
assert not logger._buffer_cache.get("1-67c39786-5908a82a246fb67f3089263f")
528+
529+
530+
def test_warning_when_alc_less_verbose_than_buffer(stdout, monkeypatch):
531+
# GIVEN Lambda ALC set to INFO
532+
monkeypatch.setenv("AWS_LAMBDA_LOG_LEVEL", "INFO")
533+
# Set initial trace ID for first Lambda invocation
534+
monkeypatch.setenv(constants.XRAY_TRACE_ID_ENV, "1-67c39786-5908a82a246fb67f3089263f")
535+
536+
# WHEN creating a logger with DEBUG buffer level
537+
# THEN a warning should be emitted
538+
with pytest.warns(PowertoolsUserWarning, match="Advanced Logging Controls*"):
539+
logger = Logger(service="test", level="DEBUG", buffer_config=LoggerBufferConfig(buffer_at_verbosity="DEBUG"))
540+
541+
# AND logging a debug message
542+
logger.debug("This is a debug")
543+
544+
# AND flushing buffer
545+
# THEN another warning should be emitted about ALC and buffer level mismatch
546+
with pytest.warns(PowertoolsUserWarning, match="Advanced Logging Controls*"):
547+
logger.flush_buffer()
548+
549+

0 commit comments

Comments
 (0)