Skip to content

Commit 281f7fd

Browse files
authored
feat(logger): implement addFilter/removeFilter to address static typing errors (#3380)
* fix(parameters): make cache aware of single vs multiple calls Signed-off-by: heitorlessa <lessa@amazon.co.uk> * chore: cleanup, add test for single and nested Signed-off-by: heitorlessa <lessa@amazon.co.uk> * feat(logger): add logFilter method * chore(logger): test addFilter * feat(logger): add removeFilter * chore: ignore sonar false positive * chore: minor typing correction that cpython didn't have --------- Signed-off-by: heitorlessa <lessa@amazon.co.uk>
1 parent b20bbe8 commit 281f7fd

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

aws_lambda_powertools/logging/logger.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ def exception(
507507
self,
508508
msg: object,
509509
*args,
510-
exc_info=True,
510+
exc_info: logging._ExcInfoType = True,
511511
stack_info: bool = False,
512512
stacklevel: int = 2,
513513
extra: Optional[Mapping[str, object]] = None,
@@ -683,6 +683,12 @@ def setLevel(self, level: Union[str, int, None]) -> None:
683683
def addHandler(self, handler: logging.Handler) -> None:
684684
return self._logger.addHandler(handler)
685685

686+
def addFilter(self, filter: logging._FilterType) -> None: # noqa: A002 # filter built-in usage
687+
return self._logger.addFilter(filter)
688+
689+
def removeFilter(self, filter: logging._FilterType) -> None: # noqa: A002 # filter built-in usage
690+
return self._logger.removeFilter(filter)
691+
686692
@property
687693
def registered_handler(self) -> logging.Handler:
688694
"""Convenience property to access the first logger handler"""

tests/functional/test_logger.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging
66
import random
77
import re
8+
import secrets
89
import string
910
import sys
1011
import warnings
@@ -1076,3 +1077,28 @@ def test_log_level_advanced_logging_controler_warning_different_log_levels_using
10761077

10771078
# THEN Logger must be INFO because it takes precedence over POWERTOOLS_LOG_LEVEL
10781079
assert logger.log_level == logging.INFO
1080+
1081+
1082+
def test_logger_add_remove_filter(stdout, service_name):
1083+
# GIVEN a Logger with a custom logging filter
1084+
class ApiKeyFilter(logging.Filter): # NOSONAR # need filter to test actual impl.
1085+
def filter(self, record):
1086+
if getattr(record, "api_key", None):
1087+
record.api_key = "REDACTED"
1088+
1089+
return True
1090+
1091+
redact_api_key_filter = ApiKeyFilter()
1092+
logger = Logger(service=service_name, stream=stdout)
1093+
logger.addFilter(redact_api_key_filter)
1094+
1095+
# WHEN a new log statement is issued
1096+
# AND another log statement is issued after filter is removed
1097+
logger.info("filtered", api_key=secrets.token_urlsafe())
1098+
logger.removeFilter(redact_api_key_filter)
1099+
logger.info("unfiltered", api_key=secrets.token_urlsafe())
1100+
1101+
# THEN logging filter should be called and mutate the log record accordingly
1102+
log = capture_multiple_logging_statements_output(stdout)
1103+
assert log[0]["api_key"] == "REDACTED"
1104+
assert log[1]["api_key"] != "REDACTED"

0 commit comments

Comments
 (0)