Skip to content

Commit 1da9bf2

Browse files
Refactoring parameters name + child logger + tests
1 parent f5618ea commit 1da9bf2

12 files changed

+170
-105
lines changed

aws_lambda_powertools/logging/buffer/config.py

+23-25
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,33 @@ class LoggerBufferConfig:
1414

1515
def __init__(
1616
self,
17-
max_size: int = 20480,
18-
minimum_log_level: LOG_LEVEL_BUFFER_VALUES = "DEBUG",
19-
flush_on_error: bool = True,
17+
max_bytes: int = 20480,
18+
buffer_at_verbosity: LOG_LEVEL_BUFFER_VALUES = "DEBUG",
19+
flush_on_error_log: bool = True,
2020
):
2121
"""
2222
Initialize logger buffer configuration.
2323
2424
Parameters
2525
----------
26-
max_size : int, optional
26+
max_bytes : int, optional
2727
Maximum size of the buffer in bytes
28-
minimum_log_level : str, optional
28+
buffer_at_verbosity : str, optional
2929
Minimum log level to buffer
30-
flush_on_error : bool, optional
30+
flush_on_error_log : bool, optional
3131
Whether to flush the buffer when an error occurs
32-
compress : bool, optional
33-
Whether to compress buffered logs
3432
"""
35-
self._validate_inputs(max_size, minimum_log_level, flush_on_error)
33+
self._validate_inputs(max_bytes, buffer_at_verbosity, flush_on_error_log)
3634

37-
self._max_size = max_size
38-
self._minimum_log_level = minimum_log_level.upper()
39-
self._flush_on_error = flush_on_error
35+
self._max_bytes = max_bytes
36+
self._buffer_at_verbosity = buffer_at_verbosity.upper()
37+
self._flush_on_error_log = flush_on_error_log
4038

4139
def _validate_inputs(
4240
self,
43-
max_size: int,
44-
minimum_log_level: str,
45-
flush_on_error: bool,
41+
max_bytes: int,
42+
buffer_at_verbosity: str,
43+
flush_on_error_log: bool,
4644
) -> None:
4745
"""
4846
Validate configuration inputs.
@@ -51,30 +49,30 @@ def _validate_inputs(
5149
----------
5250
Same as __init__ method parameters
5351
"""
54-
if not isinstance(max_size, int) or max_size <= 0:
52+
if not isinstance(max_bytes, int) or max_bytes <= 0:
5553
raise ValueError("Max size must be a positive integer")
5654

57-
if not isinstance(minimum_log_level, str):
55+
if not isinstance(buffer_at_verbosity, str):
5856
raise ValueError("Log level must be a string")
5957

6058
# Validate log level
61-
if minimum_log_level.upper() not in self.VALID_LOG_LEVELS:
59+
if buffer_at_verbosity.upper() not in self.VALID_LOG_LEVELS:
6260
raise ValueError(f"Invalid log level. Must be one of {self.VALID_LOG_LEVELS}")
6361

64-
if not isinstance(flush_on_error, bool):
62+
if not isinstance(flush_on_error_log, bool):
6563
raise ValueError("flush_on_error must be a boolean")
6664

6765
@property
68-
def max_size(self) -> int:
66+
def max_bytes(self) -> int:
6967
"""Maximum buffer size in bytes."""
70-
return self._max_size
68+
return self._max_bytes
7169

7270
@property
73-
def minimum_log_level(self) -> str:
71+
def buffer_at_verbosity(self) -> str:
7472
"""Minimum log level to buffer."""
75-
return self._minimum_log_level
73+
return self._buffer_at_verbosity
7674

7775
@property
78-
def flush_on_error(self) -> bool:
76+
def flush_on_error_log(self) -> bool:
7977
"""Flag to flush buffer on error."""
80-
return self._flush_on_error
78+
return self._flush_on_error_log

aws_lambda_powertools/logging/logger.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def __init__(
227227
utc: bool = False,
228228
use_rfc3339: bool = False,
229229
serialize_stacktrace: bool = True,
230-
logger_buffer: LoggerBufferConfig | None = None,
230+
buffer_config: LoggerBufferConfig | None = None,
231231
**kwargs,
232232
) -> None:
233233

@@ -269,9 +269,9 @@ def __init__(
269269
"serialize_stacktrace": serialize_stacktrace,
270270
}
271271

272-
self._buffer_config = logger_buffer
272+
self._buffer_config = buffer_config
273273
if self._buffer_config:
274-
self._buffer_cache = LoggerBufferCache(max_size_bytes=self._buffer_config.max_size)
274+
self._buffer_cache = LoggerBufferCache(max_size_bytes=self._buffer_config.max_bytes)
275275

276276
self._init_logger(
277277
formatter_options=formatter_options,
@@ -337,6 +337,11 @@ def _init_logger(
337337
is_logger_preconfigured = getattr(self._logger, LOGGER_ATTRIBUTE_PRECONFIGURED, False)
338338
if self.child:
339339
self.setLevel(log_level)
340+
if getattr(self._logger.parent, "powertools_buffer_config", None):
341+
# Initializes a new, empty LoggerBufferCache for child logger
342+
# Preserves parent's buffer configuration while resetting cache contents
343+
self._buffer_config = self._logger.parent.powertools_buffer_config # type: ignore[union-attr]
344+
self._buffer_cache = LoggerBufferCache(self._logger.parent.powertools_buffer_config.max_bytes) # type: ignore[union-attr]
340345
return
341346

342347
if is_logger_preconfigured:
@@ -619,7 +624,7 @@ def info(
619624
)
620625

621626
# Bypass buffer when log severity meets or exceeds configured minimum
622-
if _check_minimum_buffer_log_level(self._buffer_config.minimum_log_level, "INFO"):
627+
if _check_minimum_buffer_log_level(self._buffer_config.buffer_at_verbosity, "INFO"):
623628
return self._logger.info(
624629
msg,
625630
*args,
@@ -673,7 +678,7 @@ def warning(
673678
)
674679

675680
# Bypass buffer when log severity meets or exceeds configured minimum
676-
if _check_minimum_buffer_log_level(self._buffer_config.minimum_log_level, "WARNING"):
681+
if _check_minimum_buffer_log_level(self._buffer_config.buffer_at_verbosity, "WARNING"):
677682
return self._logger.warning(
678683
msg,
679684
*args,
@@ -711,7 +716,7 @@ def error(
711716
# 2. If auto-flush enabled, trigger complete buffer processing
712717
# 3. Error log is not "bufferable", so ensure error log is immediately available
713718

714-
if self._buffer_config and self._buffer_config.flush_on_error:
719+
if self._buffer_config and self._buffer_config.flush_on_error_log:
715720
self.flush_buffer()
716721

717722
return self._logger.error(
@@ -741,7 +746,7 @@ def critical(
741746
# 2. If auto-flush enabled, trigger complete buffer processing
742747
# 3. Critical log is not "bufferable", so ensure error log is immediately available
743748

744-
if self._buffer_config and self._buffer_config.flush_on_error:
749+
if self._buffer_config and self._buffer_config.flush_on_error_log:
745750
self.flush_buffer()
746751

747752
return self._logger.critical(
@@ -770,7 +775,7 @@ def exception(
770775
# 1. Buffer configuration checked for immediate flush
771776
# 2. If auto-flush enabled, trigger complete buffer processing
772777
# 3. Exception log is not "bufferable", so ensure error log is immediately available
773-
if self._buffer_config and self._buffer_config.flush_on_error:
778+
if self._buffer_config and self._buffer_config.flush_on_error_log:
774779
self.flush_buffer()
775780

776781
return self._logger.exception(
@@ -1133,7 +1138,7 @@ def _add_log_record_to_buffer(
11331138
except BufferError:
11341139
warnings.warn(
11351140
message="Cannot add item to the buffer. "
1136-
f"Item size exceeds total cache size {self._buffer_config.max_size} bytes",
1141+
f"Item size exceeds total cache size {self._buffer_config.max_bytes} bytes",
11371142
category=PowertoolsUserWarning,
11381143
stacklevel=2,
11391144
)

docs/core/logger.md

+12-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Logger provides an opinionated logger with output structured as JSON.
1111
* Log Lambda event when instructed (disabled by default)
1212
* Log sampling enables DEBUG log level for a percentage of requests (disabled by default)
1313
* Append additional keys to structured log at any point in time
14+
* Buffering logs for a specific request or invocation, and flushing them automatically on error or manually as needed.
1415

1516
## Getting started
1617

@@ -530,11 +531,13 @@ Log buffering enables you to buffer logs for a specific request or invocation. E
530531

531532
When configuring log buffering, you have options to fine-tune how logs are captured, stored, and emitted. You can configure the following parameters in the `LoggerBufferConfig` constructor:
532533

533-
| Parameter | Description | Configuration |
534-
|-------------------- |------------------------------------------------ |----------------------------- |
535-
| `max_size` | Maximum size of the log buffer in bytes | `int` (default: 20480 bytes) |
536-
| `minimum_log_level` | Minimum log level to buffer | `DEBUG`, `INFO`, `WARNING` |
537-
| `flush_on_error` | Automatically flush buffer when an error occurs | `True` (default), `False` |
534+
| Parameter | Description | Configuration |
535+
|---------------------- |------------------------------------------------ |----------------------------- |
536+
| `max_bytes` | Maximum size of the log buffer in bytes | `int` (default: 20480 bytes) |
537+
| `buffer_at_verbosity` | Minimum log level to buffer | `DEBUG`, `INFO`, `WARNING` |
538+
| `flush_on_error_log` | Automatically flush buffer when an error occurs | `True` (default), `False` |
539+
540+
!!! note "When `flush_on_error_log` is enabled, it automatically flushes for `logger.exception()`, `logger.error()`, and `logger.critical()` statements."
538541

539542
=== "working_with_buffering_logs_different_levels.py"
540543

@@ -550,6 +553,8 @@ When configuring log buffering, you have options to fine-tune how logs are captu
550553
--8<-- "examples/logger/src/working_with_buffering_logs_disable_on_error.py"
551554
```
552555

556+
1. Disabling `flush_on_error_log` will not flush the buffer when logging an error. This is useful when you want to control when the buffer is flushed by calling the `logger.flush_buffer()` method.
557+
553558
#### Flushing on exceptions
554559

555560
Use the `@logger.inject_lambda_context` decorator to automatically flush buffered logs when an exception is raised in your Lambda function. The `flush_buffer_on_uncaught_error` parameter captures and flush all buffered logs records before the Lambda execution terminates.
@@ -567,6 +572,8 @@ If you are using log buffering, we recommend sharing the same log instance acros
567572
!!! note "Buffer Inheritance"
568573
Loggers created with the same `service_name` automatically inherit the buffer configuration from the first initialized logger with a buffer configuration.
569574

575+
Child loggers instances inherit their parent's buffer configuration but maintain a separate buffer.
576+
570577
=== "working_with_buffering_logs_creating_instance.py"
571578

572579
```python hl_lines="2 5"

examples/logger/src/getting_started_with_buffering_logs.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33
from aws_lambda_powertools.utilities.typing import LambdaContext
44

5-
logger_buffer_config = LoggerBufferConfig(max_size=20480, flush_on_error=True)
6-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
5+
logger_buffer_config = LoggerBufferConfig(max_bytes=20480, flush_on_error_log=True)
6+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)
77

88

99
def lambda_handler(event: dict, context: LambdaContext):
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from aws_lambda_powertools import Logger
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33

4-
logger_buffer_config = LoggerBufferConfig(max_size=20480, minimum_log_level="WARNING")
5-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
4+
logger_buffer_config = LoggerBufferConfig(max_bytes=20480, buffer_at_verbosity="WARNING")
5+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)

examples/logger/src/working_with_buffering_logs_different_levels.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33
from aws_lambda_powertools.utilities.typing import LambdaContext
44

5-
logger_buffer_config = LoggerBufferConfig(minimum_log_level="WARNING") # (1)!
6-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
5+
logger_buffer_config = LoggerBufferConfig(buffer_at_verbosity="WARNING") # (1)!
6+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)
77

88

99
def lambda_handler(event: dict, context: LambdaContext):

examples/logger/src/working_with_buffering_logs_disable_on_error.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33
from aws_lambda_powertools.utilities.typing import LambdaContext
44

5-
logger_buffer_config = LoggerBufferConfig(max_size=20480, flush_on_error=False)
6-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
5+
logger_buffer_config = LoggerBufferConfig(flush_on_error_log=False) # (1)!
6+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)
77

88

99
class MyException(Exception):

examples/logger/src/working_with_buffering_logs_when_raise_exception.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33
from aws_lambda_powertools.utilities.typing import LambdaContext
44

5-
logger_buffer_config = LoggerBufferConfig(max_size=20480, flush_on_error=False)
6-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
5+
logger_buffer_config = LoggerBufferConfig(max_bytes=20480, flush_on_error_log=False)
6+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)
77

88

99
class MyException(Exception):

tests/e2e/logger/handlers/buffer_logs_with_flush.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from aws_lambda_powertools import Logger
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33

4-
logger_buffer_config = LoggerBufferConfig(max_size=10240)
4+
logger_buffer_config = LoggerBufferConfig(max_bytes=10240)
55

6-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
6+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)
77

88

99
def lambda_handler(event, context):

tests/e2e/logger/handlers/buffer_logs_without_flush.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from aws_lambda_powertools import Logger
22
from aws_lambda_powertools.logging.buffer import LoggerBufferConfig
33

4-
logger_buffer_config = LoggerBufferConfig(max_size=10240)
4+
logger_buffer_config = LoggerBufferConfig(max_bytes=10240)
55

6-
logger = Logger(level="INFO", logger_buffer=logger_buffer_config)
6+
logger = Logger(level="INFO", buffer_config=logger_buffer_config)
77

88

99
def lambda_handler(event, context):

0 commit comments

Comments
 (0)