From 7de45706ee855c97d0543612c224e6e0342a1a7d Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Mon, 22 May 2023 23:26:35 +0100 Subject: [PATCH 1/3] fix(logger): add setLevel function to set level programmatically --- aws_lambda_powertools/logging/logger.py | 16 +++++++++++++++- tests/functional/test_logger.py | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index f9c33c70ba6..a2455a9e20b 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -91,7 +91,9 @@ class Logger(logging.Logger): # lgtm [py/missing-call-to-init] service : str, optional service name to be appended in logs, by default "service_undefined" level : str, int optional - logging.level, by default "INFO" + The level to set. Can be a string representing the level name: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL' + or an integer representing the level value: 10 for 'DEBUG', 20 for 'INFO', 30 for 'WARNING', 40 for 'ERROR', 50 for 'CRITICAL'. # noqa: E501 + by default "INFO" child: bool, optional create a child Logger named ., False by default sample_rate: float, optional @@ -443,6 +445,18 @@ def decorate(event, context, *args, **kwargs): return decorate + def setLevel(self, level: Union[str, int]): + """ + Set the logging level for the logger. + + Parameters: + ----------- + level str | int + The level to set. Can be a string representing the level name: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL' + or an integer representing the level value: 10 for 'DEBUG', 20 for 'INFO', 30 for 'WARNING', 40 for 'ERROR', 50 for 'CRITICAL'. # noqa: E501 + """ + self._logger.setLevel(level) + def info( self, msg: object, diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 412a9358553..e6dbf7ebbb8 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -379,6 +379,23 @@ def test_logger_level_env_var_as_int(monkeypatch, service_name): Logger(service=service_name) +def test_logger_switch_between_levels(stdout, service_name): + # GIVEN a Loggers is initialized with INFO level + logger = Logger(service=service_name, level="INFO", stream=stdout) + logger.info("message info") + + # WHEN we switch to DEBUG level + logger.setLevel(level="DEBUG") + logger.debug("message debug") + + # THEN we must have different levels and messages in stdout + log_output = capture_multiple_logging_statements_output(stdout) + assert log_output[0]["level"] == "INFO" + assert log_output[0]["message"] == "message info" + assert log_output[1]["level"] == "DEBUG" + assert log_output[1]["message"] == "message debug" + + def test_logger_record_caller_location(stdout, service_name): # GIVEN Logger is initialized logger = Logger(service=service_name, stream=stdout) From 56cf8d13ce007056d5a80c0960d44054979ef319 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 24 May 2023 10:11:47 +0100 Subject: [PATCH 2/3] fix(logger): Heitor's feedback --- aws_lambda_powertools/logging/logger.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index a2455a9e20b..d1ca7c8a5a0 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -455,6 +455,7 @@ def setLevel(self, level: Union[str, int]): The level to set. Can be a string representing the level name: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL' or an integer representing the level value: 10 for 'DEBUG', 20 for 'INFO', 30 for 'WARNING', 40 for 'ERROR', 50 for 'CRITICAL'. # noqa: E501 """ + self.log_level = level self._logger.setLevel(level) def info( From 2d4e6f4f9e8f4a06a460358c105a418b78264e5a Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 24 May 2023 10:22:18 +0100 Subject: [PATCH 3/3] fix(logger): Heitor's feedback --- aws_lambda_powertools/logging/logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index d1ca7c8a5a0..88ba8122da9 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -329,7 +329,7 @@ def _configure_sampling(self): try: if self.sampling_rate and random.random() <= float(self.sampling_rate): logger.debug("Setting log level to Debug due to sampling rate") - self.log_level = logging.DEBUG + self.setLevel(logging.DEBUG) except ValueError: raise InvalidLoggerSamplingRateError( f"Expected a float value ranging 0 to 1, but received {self.sampling_rate} instead."