"""Module to log messages to files."""# pylint: disable=line-too-longfrom__future__importannotationsimportcopyimportjsonimportloggingfromtypingimportAnyREDACTED:str="**redacted**"_LOGGER=logging.getLogger(__name__)REDACTED_FIELDS=["lat","long","address1","address2","city","state","country","postalCode","serialNumber","deviceIpAddress","macAddress","businessPartnerNo","e164PhoneNumber","displayPhoneNumber","adminEmails","associatedUsers","access_token","refresh_token","id_token","email","firstName","lastName",]REDACTED_LISTS=["deviceSerialNumbers",]
[docs]defredact_fields(log_message:Any)->Any:"""Removes redacted fields from messages."""# This can be optimized, but for now, it works and has a test.ifisinstance(log_message,dict):fork,vinlog_message.items():ifisinstance(v,dict):log_message[k]=redact_fields(v)elifisinstance(v,list):ifkinREDACTED_LISTS:log_message[k]=[REDACTEDfor_inv]else:log_message[k]=[redact_fields(i)foriinv]forfieldinREDACTED_FIELDS:iffieldinlog_message:log_message[field]=REDACTEDelifisinstance(log_message,list):foriinrange(len(log_message)):ifisinstance(log_message[i],dict):log_message[i]=redact_fields(log_message[i])elifisinstance(log_message[i],list):log_message[i]=[redact_fields(j)forjinlog_message[i]]forfieldinREDACTED_FIELDS:iffieldinlog_message[i]:log_message[i][field]=REDACTEDreturnlog_message
[docs]deflog_json_message(json_message:dict[str,Any]|list[dict[str,Any]])->None:"""Logs a JSON message redacting sensitive information."""ifnotjson_message:_LOGGER.debug("No JSON message to log")returnlog_message=redact_fields(copy.deepcopy(json_message))_LOGGER.debug(json.dumps(log_message,indent=4))