Source code for aiokem.message_logger

"""Module to log messages to files."""
# pylint: disable=line-too-long

from __future__ import annotations

import copy
import json
import logging
from typing import Any

REDACTED: 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] def redact_fields(log_message: Any) -> Any: """Removes redacted fields from messages.""" # This can be optimized, but for now, it works and has a test. if isinstance(log_message, dict): for k, v in log_message.items(): if isinstance(v, dict): log_message[k] = redact_fields(v) elif isinstance(v, list): if k in REDACTED_LISTS: log_message[k] = [REDACTED for _ in v] else: log_message[k] = [redact_fields(i) for i in v] for field in REDACTED_FIELDS: if field in log_message: log_message[field] = REDACTED elif isinstance(log_message, list): for i in range(len(log_message)): if isinstance(log_message[i], dict): log_message[i] = redact_fields(log_message[i]) elif isinstance(log_message[i], list): log_message[i] = [redact_fields(j) for j in log_message[i]] for field in REDACTED_FIELDS: if field in log_message[i]: log_message[i][field] = REDACTED return log_message
[docs] def log_json_message(json_message: dict[str, Any] | list[dict[str, Any]]) -> None: """Logs a JSON message redacting sensitive information.""" if not json_message: _LOGGER.debug("No JSON message to log") return log_message = redact_fields(copy.deepcopy(json_message)) _LOGGER.debug(json.dumps(log_message, indent=4))