Skip to content

Commit 505eb98

Browse files
Adding initial logic + test
1 parent 0893e14 commit 505eb98

File tree

6 files changed

+207
-142
lines changed

6 files changed

+207
-142
lines changed

aws_lambda_powertools/logging/buffer/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class LoggerBufferConfig:
1212
"""
1313

1414
# Define class-level constant for valid log levels
15-
VALID_LOG_LEVELS: list[str] = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
15+
VALID_LOG_LEVELS: list[str] = ["DEBUG", "INFO", "WARNING"]
1616

1717
def __init__(
1818
self,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from __future__ import annotations
2+
3+
import inspect
4+
import time
5+
from typing import Any
6+
7+
8+
def _create_buffer_record(level: str, msg: object, args: object, **kwargs) -> dict[str, Any]:
9+
caller_frame = inspect.stack()[2]
10+
timestamp = time.time()
11+
12+
return {
13+
"level": level.upper(),
14+
"msg": msg,
15+
"args": args,
16+
"filename": caller_frame.filename,
17+
"line": caller_frame.lineno,
18+
"function": caller_frame.function,
19+
"extra_kwargs": kwargs or {},
20+
"timestamp": timestamp,
21+
}
22+
23+
24+
def _resolve_buffer_log_level(buffer_log_level, current_log_level):
25+
# Define log level mapping
26+
log_levels = {
27+
"DEBUG": 10,
28+
"INFO": 20,
29+
"WARNING": 30,
30+
"ERROR": 40,
31+
"CRITICAL": 50,
32+
}
33+
34+
# Convert string levels to numeric if needed
35+
buffer_level_num = log_levels.get(buffer_log_level.upper())
36+
current_level_num = log_levels.get(current_log_level.upper())
37+
38+
# Compare numeric levels
39+
if buffer_level_num < current_level_num:
40+
return True
41+
42+
return False

aws_lambda_powertools/logging/logger.py

Lines changed: 69 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
import os
1313
import random
1414
import sys
15-
import time
1615
import warnings
1716
from contextlib import contextmanager
1817
from typing import IO, TYPE_CHECKING, Any, Callable, Generator, Iterable, Mapping, TypeVar, overload
1918

2019
from aws_lambda_powertools.logging.buffer.cache import LoggerBufferCache
20+
from aws_lambda_powertools.logging.buffer.functions import _create_buffer_record, _resolve_buffer_log_level
2121
from aws_lambda_powertools.logging.constants import (
2222
LOGGER_ATTRIBUTE_PRECONFIGURED,
2323
)
@@ -459,12 +459,12 @@ def decorate(event, context, *args, **kwargs):
459459
return decorate
460460

461461
def _add_log_to_buffer(self, level, msg, filename, line, function, **kwargs):
462-
if self._buffer_cache:
463-
return False
462+
# Initial implementation, will always cache
463+
self._buffer_cache.add("XRAY_ID", msg)
464464

465465
return True
466466

467-
def info(
467+
def debug(
468468
self,
469469
msg: object,
470470
*args: object,
@@ -477,20 +477,9 @@ def info(
477477
extra = extra or {}
478478
extra = {**extra, **kwargs}
479479

480-
if self._logger_buffer:
481-
caller_frame = inspect.stack()[1]
482-
record = {
483-
"level": "INFO",
484-
"msg": msg % args if args else msg,
485-
"filename": caller_frame.filename,
486-
"line": caller_frame.lineno,
487-
"function": caller_frame.function,
488-
"extra_kwargs": kwargs,
489-
"timestamp": time.time(),
490-
}
491-
return self._add_log_to_buffer(**record)
492-
else:
493-
return self._logger.info(
480+
# Buffer is not active, flushing
481+
if not self._logger_buffer:
482+
return self._logger.debug(
494483
msg,
495484
*args,
496485
exc_info=exc_info,
@@ -499,7 +488,11 @@ def info(
499488
extra=extra,
500489
)
501490

502-
def error(
491+
log_record = _create_buffer_record(level="DEBUG", msg=msg, args=args, **kwargs)
492+
493+
self._add_log_to_buffer(**log_record)
494+
495+
def info(
503496
self,
504497
msg: object,
505498
*args: object,
@@ -512,20 +505,36 @@ def error(
512505
extra = extra or {}
513506
extra = {**extra, **kwargs}
514507

515-
return self._logger.error(
516-
msg,
517-
*args,
518-
exc_info=exc_info,
519-
stack_info=stack_info,
520-
stacklevel=stacklevel,
521-
extra=extra,
522-
)
508+
# Buffer is not active, flushing
509+
if not self._logger_buffer:
510+
return self._logger.info(
511+
msg,
512+
*args,
513+
exc_info=exc_info,
514+
stack_info=stack_info,
515+
stacklevel=stacklevel,
516+
extra=extra,
517+
)
523518

524-
def exception(
519+
if _resolve_buffer_log_level(self._logger_buffer.minimum_log_level, "INFO"):
520+
return self._logger.info(
521+
msg,
522+
*args,
523+
exc_info=exc_info,
524+
stack_info=stack_info,
525+
stacklevel=stacklevel,
526+
extra=extra,
527+
)
528+
529+
log_record: dict[str, Any] = _create_buffer_record(level="INFO", msg=msg, args=args, **kwargs)
530+
531+
self._add_log_to_buffer(**log_record)
532+
533+
def warning(
525534
self,
526535
msg: object,
527536
*args: object,
528-
exc_info: logging._ExcInfoType = True,
537+
exc_info: logging._ExcInfoType = None,
529538
stack_info: bool = False,
530539
stacklevel: int = 2,
531540
extra: Mapping[str, object] | None = None,
@@ -534,16 +543,32 @@ def exception(
534543
extra = extra or {}
535544
extra = {**extra, **kwargs}
536545

537-
return self._logger.exception(
538-
msg,
539-
*args,
540-
exc_info=exc_info,
541-
stack_info=stack_info,
542-
stacklevel=stacklevel,
543-
extra=extra,
544-
)
546+
# Buffer is not active, flushing
547+
if not self._logger_buffer:
548+
return self._logger.warning(
549+
msg,
550+
*args,
551+
exc_info=exc_info,
552+
stack_info=stack_info,
553+
stacklevel=stacklevel,
554+
extra=extra,
555+
)
545556

546-
def critical(
557+
if _resolve_buffer_log_level(self._logger_buffer.minimum_log_level, "WARNING"):
558+
return self._logger.warning(
559+
msg,
560+
*args,
561+
exc_info=exc_info,
562+
stack_info=stack_info,
563+
stacklevel=stacklevel,
564+
extra=extra,
565+
)
566+
567+
log_record = _create_buffer_record(level="WARNING", msg=msg, args=args, **kwargs)
568+
569+
self._add_log_to_buffer(**log_record)
570+
571+
def error(
547572
self,
548573
msg: object,
549574
*args: object,
@@ -556,7 +581,7 @@ def critical(
556581
extra = extra or {}
557582
extra = {**extra, **kwargs}
558583

559-
return self._logger.critical(
584+
return self._logger.error(
560585
msg,
561586
*args,
562587
exc_info=exc_info,
@@ -565,7 +590,7 @@ def critical(
565590
extra=extra,
566591
)
567592

568-
def warning(
593+
def critical(
569594
self,
570595
msg: object,
571596
*args: object,
@@ -578,7 +603,7 @@ def warning(
578603
extra = extra or {}
579604
extra = {**extra, **kwargs}
580605

581-
return self._logger.warning(
606+
return self._logger.critical(
582607
msg,
583608
*args,
584609
exc_info=exc_info,
@@ -587,11 +612,11 @@ def warning(
587612
extra=extra,
588613
)
589614

590-
def debug(
615+
def exception(
591616
self,
592617
msg: object,
593618
*args: object,
594-
exc_info: logging._ExcInfoType = None,
619+
exc_info: logging._ExcInfoType = True,
595620
stack_info: bool = False,
596621
stacklevel: int = 2,
597622
extra: Mapping[str, object] | None = None,
@@ -600,7 +625,7 @@ def debug(
600625
extra = extra or {}
601626
extra = {**extra, **kwargs}
602627

603-
return self._logger.debug(
628+
return self._logger.exception(
604629
msg,
605630
*args,
606631
exc_info=exc_info,

tests/functional/logger/required_dependencies/test_logger_powertools_buffer.py

Lines changed: 0 additions & 96 deletions
This file was deleted.

0 commit comments

Comments
 (0)