From 2b32ab2fe2508f876e671eeb4206c37f30124e49 Mon Sep 17 00:00:00 2001 From: heitorlessa <lessa@amazon.co.uk> Date: Fri, 1 Apr 2022 08:06:55 +0100 Subject: [PATCH 1/2] chore: add tests to reproduce regression --- tests/functional/test_logger.py | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 9bbc4452d98..d75bd005844 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -663,6 +663,42 @@ def handler(event, context): assert "my_key" not in second_log +def test_clear_state_keeps_standard_keys(lambda_context, stdout, service_name): + # GIVEN + logger = Logger(service=service_name, stream=stdout) + standard_keys = ["level", "location", "message", "timestamp", "service"] + + # WHEN clear_state is set + @logger.inject_lambda_context(clear_state=True) + def handler(event, context): + logger.info("Foo") + + # THEN all standard keys should be available as usual + handler({}, lambda_context) + + log = capture_logging_output(stdout) + for key in standard_keys: + assert key in log + + +def test_clear_state_keeps_exception_keys(lambda_context, stdout, service_name): + # GIVEN + logger = Logger(service=service_name, stream=stdout) + + # WHEN clear_state is set and an exception was logged + @logger.inject_lambda_context(clear_state=True) + def handler(event, context): + try: + raise ValueError("something went wrong") + except Exception: + logger.exception("Received an exception") + + # THEN we expect a "exception_name" to be "ValueError" + handler({}, lambda_context) + log = capture_logging_output(stdout) + assert "ValueError" == log["exception_name"] + + def test_inject_lambda_context_allows_handler_with_kwargs(lambda_context, stdout, service_name): # GIVEN logger = Logger(service=service_name, stream=stdout) From 80cb6ec0c2c0347317004388621b598935d2f4e8 Mon Sep 17 00:00:00 2001 From: heitorlessa <lessa@amazon.co.uk> Date: Fri, 1 Apr 2022 08:18:46 +0100 Subject: [PATCH 2/2] fix(logger): ensure default keys are added when cleared --- aws_lambda_powertools/logging/formatter.py | 1 + tests/functional/test_logger.py | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 1b42df249ae..90799b84ed1 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -187,6 +187,7 @@ def remove_keys(self, keys: Iterable[str]): def clear_state(self): self.log_format = dict.fromkeys(self.log_record_order) + self.log_format.update(**self._build_default_keys()) @staticmethod def _build_default_keys(): diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index d75bd005844..de9de42601f 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -675,10 +675,12 @@ def handler(event, context): # THEN all standard keys should be available as usual handler({}, lambda_context) + handler({}, lambda_context) - log = capture_logging_output(stdout) + first_log, second_log = capture_multiple_logging_statements_output(stdout) for key in standard_keys: - assert key in log + assert key in first_log + assert key in second_log def test_clear_state_keeps_exception_keys(lambda_context, stdout, service_name):