Skip to content

Commit 55738b9

Browse files
fix(logger): add setLevel function to set level programmatically (#2320)
1 parent ab47c92 commit 55738b9

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

aws_lambda_powertools/logging/logger.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ class Logger(logging.Logger): # lgtm [py/missing-call-to-init]
9191
service : str, optional
9292
service name to be appended in logs, by default "service_undefined"
9393
level : str, int optional
94-
logging.level, by default "INFO"
94+
The level to set. Can be a string representing the level name: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'
95+
or an integer representing the level value: 10 for 'DEBUG', 20 for 'INFO', 30 for 'WARNING', 40 for 'ERROR', 50 for 'CRITICAL'. # noqa: E501
96+
by default "INFO"
9597
child: bool, optional
9698
create a child Logger named <service>.<caller_file_name>, False by default
9799
sample_rate: float, optional
@@ -327,7 +329,7 @@ def _configure_sampling(self):
327329
try:
328330
if self.sampling_rate and random.random() <= float(self.sampling_rate):
329331
logger.debug("Setting log level to Debug due to sampling rate")
330-
self.log_level = logging.DEBUG
332+
self.setLevel(logging.DEBUG)
331333
except ValueError:
332334
raise InvalidLoggerSamplingRateError(
333335
f"Expected a float value ranging 0 to 1, but received {self.sampling_rate} instead."
@@ -443,6 +445,19 @@ def decorate(event, context, *args, **kwargs):
443445

444446
return decorate
445447

448+
def setLevel(self, level: Union[str, int]):
449+
"""
450+
Set the logging level for the logger.
451+
452+
Parameters:
453+
-----------
454+
level str | int
455+
The level to set. Can be a string representing the level name: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'
456+
or an integer representing the level value: 10 for 'DEBUG', 20 for 'INFO', 30 for 'WARNING', 40 for 'ERROR', 50 for 'CRITICAL'. # noqa: E501
457+
"""
458+
self.log_level = level
459+
self._logger.setLevel(level)
460+
446461
def info(
447462
self,
448463
msg: object,

tests/functional/test_logger.py

+17
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,23 @@ def test_logger_level_env_var_as_int(monkeypatch, service_name):
379379
Logger(service=service_name)
380380

381381

382+
def test_logger_switch_between_levels(stdout, service_name):
383+
# GIVEN a Loggers is initialized with INFO level
384+
logger = Logger(service=service_name, level="INFO", stream=stdout)
385+
logger.info("message info")
386+
387+
# WHEN we switch to DEBUG level
388+
logger.setLevel(level="DEBUG")
389+
logger.debug("message debug")
390+
391+
# THEN we must have different levels and messages in stdout
392+
log_output = capture_multiple_logging_statements_output(stdout)
393+
assert log_output[0]["level"] == "INFO"
394+
assert log_output[0]["message"] == "message info"
395+
assert log_output[1]["level"] == "DEBUG"
396+
assert log_output[1]["message"] == "message debug"
397+
398+
382399
def test_logger_record_caller_location(stdout, service_name):
383400
# GIVEN Logger is initialized
384401
logger = Logger(service=service_name, stream=stdout)

0 commit comments

Comments
 (0)