diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 07971ba0a26..0d0750b4085 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -152,7 +152,11 @@ 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) + # 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) 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..412a9358553 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -251,6 +251,19 @@ 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) + + # WHEN log level info + logger.info("log", exception="exception_value", exception_name="exception_name_value") + + # 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