From a3d098ab160ee2d645dc594d4d70ce191b829dd2 Mon Sep 17 00:00:00 2001 From: Iago Veloso Date: Wed, 15 Feb 2023 16:31:56 +0100 Subject: [PATCH 1/3] fix(logger) Allow reporting entry logs with custom exception and exception_name fields (#1923) --- aws_lambda_powertools/logging/formatter.py | 4 +++- tests/functional/test_logger.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 07971ba0a26..80832b7945c 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -152,7 +152,9 @@ def format(self, record: logging.LogRecord) -> str: # noqa: A003 """Format logging record as structured JSON str""" formatted_log = self._extract_log_keys(log_record=record) formatted_log["message"] = self._extract_log_message(log_record=record) - formatted_log["exception"], formatted_log["exception_name"] = self._extract_log_exception(log_record=record) + extracted_exception, extracted_exception_name = self._extract_log_exception(log_record=record) + formatted_log["exception"] = formatted_log.get("exception", extracted_exception) + formatted_log["exception_name"] = formatted_log.get("exception_name", extracted_exception_name) formatted_log["xray_trace_id"] = self._get_latest_trace_id() formatted_log = self._strip_none_records(records=formatted_log) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 0e576752508..661f03589ea 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -251,6 +251,20 @@ def test_logger_append_duplicated(stdout, service_name): assert "new_value" == log["request_id"] +def test_logger_honors_given_exception_keys(stdout, service_name): + # GIVEN Logger is initialized with exception and exception_name fields + logger = Logger( + service=service_name, stream=stdout, exception="exception_value", exception_name="exception_name_value" + ) + + logger.info("log") + + # THEN log statements should have these keys + log = capture_logging_output(stdout) + assert "exception_value" == log["exception"] + assert "exception_name_value" == log["exception_name"] + + def test_logger_invalid_sampling_rate(service_name): # GIVEN Logger is initialized # WHEN sampling_rate non-numeric value From c62d3720bc45e13d26d7df64a7d82d1de0594cc9 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 15 Feb 2023 16:21:43 +0000 Subject: [PATCH 2/3] fix(logger): adding comments --- aws_lambda_powertools/logging/formatter.py | 2 ++ tests/functional/test_logger.py | 1 + 2 files changed, 3 insertions(+) diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 80832b7945c..0d0750b4085 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -152,6 +152,8 @@ def format(self, record: logging.LogRecord) -> str: # noqa: A003 """Format logging record as structured JSON str""" formatted_log = self._extract_log_keys(log_record=record) formatted_log["message"] = self._extract_log_message(log_record=record) + # exception and exception_name fields can be added as extra key + # in any log level, we try to extract and use them first extracted_exception, extracted_exception_name = self._extract_log_exception(log_record=record) formatted_log["exception"] = formatted_log.get("exception", extracted_exception) formatted_log["exception_name"] = formatted_log.get("exception_name", extracted_exception_name) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 661f03589ea..6ee38be4096 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -257,6 +257,7 @@ def test_logger_honors_given_exception_keys(stdout, service_name): service=service_name, stream=stdout, exception="exception_value", exception_name="exception_name_value" ) + # WHEN log level info logger.info("log") # THEN log statements should have these keys From ba9b84f253cfd3af1f8385cc2412d5e431d8303a Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 15 Feb 2023 22:17:32 +0000 Subject: [PATCH 3/3] fix(logger): making tests more readable --- tests/functional/test_logger.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 6ee38be4096..412a9358553 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -253,12 +253,10 @@ def test_logger_append_duplicated(stdout, service_name): def test_logger_honors_given_exception_keys(stdout, service_name): # GIVEN Logger is initialized with exception and exception_name fields - logger = Logger( - service=service_name, stream=stdout, exception="exception_value", exception_name="exception_name_value" - ) + logger = Logger(service=service_name, stream=stdout) # WHEN log level info - logger.info("log") + logger.info("log", exception="exception_value", exception_name="exception_name_value") # THEN log statements should have these keys log = capture_logging_output(stdout)