Skip to content

Commit 93f4a13

Browse files
Adding initial logic + test
1 parent 8a4e7bf commit 93f4a13

File tree

2 files changed

+74
-2
lines changed

2 files changed

+74
-2
lines changed

aws_lambda_powertools/logging/logger.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,10 @@ def _add_log_to_buffer(self, level, msg, filename, line, function, **kwargs):
463463

464464
return True
465465

466+
def flush_buffer(self):
467+
## INITIAL IMPLEMENTATION
468+
self._logger.debug("Buffer was flushed")
469+
466470
def debug(
467471
self,
468472
msg: object,
@@ -504,7 +508,7 @@ def info(
504508
extra = extra or {}
505509
extra = {**extra, **kwargs}
506510

507-
# Buffer is not active, flushing
511+
# Buffer is not active and we need to flush
508512
if not self._logger_buffer:
509513
return self._logger.info(
510514
msg,
@@ -515,6 +519,7 @@ def info(
515519
extra=extra,
516520
)
517521

522+
# Buffer log level is higher than this log level and we need to flush
518523
if _resolve_buffer_log_level(self._logger_buffer.minimum_log_level, "INFO"):
519524
return self._logger.info(
520525
msg,
@@ -542,7 +547,7 @@ def warning(
542547
extra = extra or {}
543548
extra = {**extra, **kwargs}
544549

545-
# Buffer is not active, flushing
550+
# Buffer is not active and we need to flush
546551
if not self._logger_buffer:
547552
return self._logger.warning(
548553
msg,
@@ -553,6 +558,7 @@ def warning(
553558
extra=extra,
554559
)
555560

561+
# Buffer log level is higher than this log level and we need to flush
556562
if _resolve_buffer_log_level(self._logger_buffer.minimum_log_level, "WARNING"):
557563
return self._logger.warning(
558564
msg,
@@ -580,6 +586,12 @@ def error(
580586
extra = extra or {}
581587
extra = {**extra, **kwargs}
582588

589+
# Buffer is active and an error happened
590+
# LoggerBufferConfig flush_on_error is True
591+
# So, we need to flush the buffer
592+
if self._logger_buffer and self._logger_buffer.flush_on_error:
593+
self.flush_buffer()
594+
583595
return self._logger.error(
584596
msg,
585597
*args,
@@ -602,6 +614,12 @@ def critical(
602614
extra = extra or {}
603615
extra = {**extra, **kwargs}
604616

617+
# Buffer is active and an error happened
618+
# LoggerBufferConfig flush_on_error is True
619+
# So, we need to flush the buffer
620+
if self._logger_buffer and self._logger_buffer.flush_on_error:
621+
self.flush_buffer()
622+
605623
return self._logger.critical(
606624
msg,
607625
*args,
@@ -624,6 +642,12 @@ def exception(
624642
extra = extra or {}
625643
extra = {**extra, **kwargs}
626644

645+
# Buffer is active and an error happened
646+
# LoggerBufferConfig flush_on_error is True
647+
# So, we need to flush the buffer
648+
if self._logger_buffer and self._logger_buffer.flush_on_error:
649+
self.flush_buffer()
650+
627651
return self._logger.exception(
628652
msg,
629653
*args,

tests/functional/logger/required_dependencies/test_powertools_logger_buffer.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,51 @@ def test_logger_buffer_is_never_buffered_with_error_new(stdout, service_name):
9292
# THEN: We expect the log record is not buffered
9393
log = capture_logging_output(stdout)
9494
assert "Received an exception" == log["message"]
95+
96+
97+
@pytest.mark.parametrize("log_level", ["CRITICAL", "ERROR"])
98+
def test_logger_buffer_is_flushed_when_an_error_happens(stdout, service_name, log_level):
99+
# GIVEN: A logger configured with buffer
100+
logger_buffer_config = LoggerBufferConfig(max_size=10240, minimum_log_level="DEBUG", flush_on_error=True)
101+
logger = Logger(level="DEBUG", service=service_name, stream=stdout, logger_buffer=logger_buffer_config)
102+
103+
logger.debug("this log line will be flushed")
104+
logger.debug("this log line will be flushed too")
105+
106+
log_command = {
107+
"CRITICAL": logger.critical,
108+
"ERROR": logger.error,
109+
"EXCEPTION": logger.exception,
110+
}
111+
112+
# WHEN a log message is sent using the corresponding log method
113+
log_message = log_command[log_level]
114+
log_message("Received an exception")
115+
116+
# THEN: We expect the log record is not buffered
117+
log = capture_multiple_logging_statements_output(stdout)
118+
assert "Buffer was flushed" == log[0]["message"]
119+
120+
121+
@pytest.mark.parametrize("log_level", ["CRITICAL", "ERROR"])
122+
def test_logger_buffer_is_not_flushed_when_an_error_happens(stdout, service_name, log_level):
123+
# GIVEN: A logger configured with buffer
124+
logger_buffer_config = LoggerBufferConfig(max_size=10240, minimum_log_level="DEBUG", flush_on_error=False)
125+
logger = Logger(level="DEBUG", service=service_name, stream=stdout, logger_buffer=logger_buffer_config)
126+
127+
logger.debug("this log line will be flushed")
128+
logger.debug("this log line will be flushed too")
129+
130+
log_command = {
131+
"CRITICAL": logger.critical,
132+
"ERROR": logger.error,
133+
"EXCEPTION": logger.exception,
134+
}
135+
136+
# WHEN a log message is sent using the corresponding log method
137+
log_message = log_command[log_level]
138+
log_message("Received an exception")
139+
140+
# THEN: We expect the log record is not buffered
141+
log = capture_logging_output(stdout)
142+
assert "Received an exception" == log["message"]

0 commit comments

Comments
 (0)