From 8e5673aa36c9b9ad1916a785ec4b156c2277d40d Mon Sep 17 00:00:00 2001 From: Elias Brange Date: Wed, 6 Apr 2022 11:06:48 +0200 Subject: [PATCH 1/3] chore: add test to reproduce clear state bug with custom keys --- tests/functional/test_logger.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index de9de42601f..25e8faf46f7 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -683,6 +683,29 @@ def handler(event, context): assert key in second_log +def test_clear_state_keeps_custom_keys(lambda_context, stdout, service_name): + # GIVEN + date_format = "%Y" + location_format = "%(module)s:%(funcName)s:%(lineno)d" + logger = Logger(service=service_name, stream=stdout, location=location_format, datefmt=date_format) + + # 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) + handler({}, lambda_context) + + first_log, second_log = capture_multiple_logging_statements_output(stdout) + + assert re.fullmatch("[0-9]{4}", first_log["timestamp"]) + assert re.fullmatch("[0-9]{4}", second_log["timestamp"]) + assert re.fullmatch(".+:.+:[0-9]+", first_log["location"]) + assert re.fullmatch(".+:.+:[0-9]+", second_log["location"]) + + def test_clear_state_keeps_exception_keys(lambda_context, stdout, service_name): # GIVEN logger = Logger(service=service_name, stream=stdout) From 58217e96ce0108f8759122f1f9a370a98b3353d4 Mon Sep 17 00:00:00 2001 From: Elias Brange Date: Wed, 6 Apr 2022 11:13:17 +0200 Subject: [PATCH 2/3] fix(logger): ensure custom key formats are kept when cleared --- aws_lambda_powertools/logging/formatter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 90799b84ed1..becfc9de85c 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -127,8 +127,8 @@ def __init__( super(LambdaPowertoolsFormatter, self).__init__(datefmt=self.datefmt) - keys_combined = {**self._build_default_keys(), **kwargs} - self.log_format.update(**keys_combined) + self.keys_combined = {**self._build_default_keys(), **kwargs} + self.log_format.update(**self.keys_combined) def serialize(self, log: Dict) -> str: """Serialize structured log dict to JSON str""" @@ -187,7 +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()) + self.log_format.update(**self.keys_combined) @staticmethod def _build_default_keys(): From 4318dccf2a0a2a41d534463840e58422f66f7023 Mon Sep 17 00:00:00 2001 From: Elias Brange Date: Wed, 6 Apr 2022 11:43:32 +0200 Subject: [PATCH 3/3] chore: refrain from regex in test case --- tests/functional/test_logger.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 25e8faf46f7..f4a814e4913 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -685,9 +685,8 @@ def handler(event, context): def test_clear_state_keeps_custom_keys(lambda_context, stdout, service_name): # GIVEN - date_format = "%Y" - location_format = "%(module)s:%(funcName)s:%(lineno)d" - logger = Logger(service=service_name, stream=stdout, location=location_format, datefmt=date_format) + location_format = "%(module)s.%(funcName)s:clear_state" + logger = Logger(service=service_name, stream=stdout, location=location_format, custom_key="foo") # WHEN clear_state is set @logger.inject_lambda_context(clear_state=True) @@ -699,11 +698,9 @@ def handler(event, context): handler({}, lambda_context) first_log, second_log = capture_multiple_logging_statements_output(stdout) - - assert re.fullmatch("[0-9]{4}", first_log["timestamp"]) - assert re.fullmatch("[0-9]{4}", second_log["timestamp"]) - assert re.fullmatch(".+:.+:[0-9]+", first_log["location"]) - assert re.fullmatch(".+:.+:[0-9]+", second_log["location"]) + for log in (first_log, second_log): + assert "foo" == log["custom_key"] + assert "test_logger.handler:clear_state" == log["location"] def test_clear_state_keeps_exception_keys(lambda_context, stdout, service_name):