This commit is contained in:
Kenneth Kehl
2024-06-11 12:17:14 -07:00
parent 76c34ffae6
commit bfae1f57f2
2 changed files with 24 additions and 29 deletions

View File

@@ -70,6 +70,7 @@ def configure_handler(handler, app, formatter):
handler.addFilter(AppNameFilter(app.config["NOTIFY_APP_NAME"])) handler.addFilter(AppNameFilter(app.config["NOTIFY_APP_NAME"]))
handler.addFilter(RequestIdFilter()) handler.addFilter(RequestIdFilter())
handler.addFilter(ServiceIdFilter()) handler.addFilter(ServiceIdFilter())
handler.addFilter(PIIFilter())
return handler return handler
@@ -116,26 +117,7 @@ class ServiceIdFilter(logging.Filter):
return record return record
class JSONFormatter(BaseJSONFormatter): class PIIFilter(logging.Filter):
def process_log_record(self, log_record):
rename_map = {
"asctime": "time",
"request_id": "requestId",
"app_name": "application",
"service_id": "service_id",
}
for key, newkey in rename_map.items():
log_record[newkey] = log_record.pop(key)
log_record["logType"] = "application"
try:
log_record["message"] = log_record["message"].format(**log_record)
except (KeyError, IndexError) as e:
logger.exception("failed to format log message: {} not found".format(e))
return log_record
class PIIFormatter(BaseJSONFormatter):
def scrub(self, msg): def scrub(self, msg):
# Eventually we want to scrub all messages in all logs for phone numbers # Eventually we want to scrub all messages in all logs for phone numbers
# and email addresses, masking them. Ultimately this will probably get # and email addresses, masking them. Ultimately this will probably get
@@ -154,9 +136,24 @@ class PIIFormatter(BaseJSONFormatter):
msg = msg.replace(email, f"XXXXX{email[-10:]}") msg = msg.replace(email, f"XXXXX{email[-10:]}")
return msg return msg
def filter(self, record):
record.msg = self.scrub(record.msg)
return record
class JSONFormatter(BaseJSONFormatter):
def process_log_record(self, log_record): def process_log_record(self, log_record):
rename_map = {
"asctime": "time",
"request_id": "requestId",
"app_name": "application",
"service_id": "service_id",
}
for key, newkey in rename_map.items():
log_record[newkey] = log_record.pop(key)
log_record["logType"] = "application"
try: try:
log_record["message"] = self.scrub(log_record["message"]) log_record["message"] = log_record["message"].format(**log_record)
except (KeyError, IndexError, ValueError) as e: except (KeyError, IndexError) as e:
logger.exception(f"failed to scrub log message: {e}") logger.exception("failed to format log message: {} not found".format(e))
return log_record return log_record

View File

@@ -51,7 +51,7 @@ def test_base_json_formatter_contains_service_id():
assert service_id_filter.filter(record).service_id == "notify-admin" assert service_id_filter.filter(record).service_id == "notify-admin"
def test_scrub(): def test_pii_filter():
record = builtin_logging.LogRecord( record = builtin_logging.LogRecord(
name="log thing", name="log thing",
level="info", level="info",
@@ -61,8 +61,6 @@ def test_scrub():
exc_info=None, exc_info=None,
args=None, args=None,
) )
pii_filter = logging.PIIFilter()
assert ( x = pii_filter.filter(record)
json.loads(logging.PIIFormatter().format(record))["message"] assert pii_filter.filter(record).msg == "phone1: 1XXXXX55555, phone2: 1XXXXX55554, email1: XXXXXe@fake.gov, email2: XXXXX2.fake.gov"
== "phone1: 1XXXXX55555, phone2: 1XXXXX55554, email1: XXXXXe@fake.gov, email2: XXXXX2.fake.gov"
)