diff --git a/app/logging_config.py b/app/logging_config.py index 7e995ed..9766009 100644 --- a/app/logging_config.py +++ b/app/logging_config.py @@ -1,37 +1,20 @@ import json import logging -from urllib.parse import urlsplit, urlunsplit +from datetime import UTC, datetime - -SENSITIVE_KEYS = {"url", "location"} - - -def redact_url(value: str) -> str: - try: - parts = urlsplit(value) - if not parts.scheme or not parts.hostname: - return "[redacted]" - host = parts.hostname - if ":" in host: - host = f"[{host}]" - if parts.port: - host = f"{host}:{parts.port}" - return urlunsplit((parts.scheme, host, parts.path, "", "")) - except (TypeError, ValueError): - return "[redacted]" +_STANDARD = set(logging.makeLogRecord({}).__dict__) | {"message", "asctime"} class JsonFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: payload: dict[str, object] = { + "timestamp": datetime.now(UTC).isoformat(), "level": record.levelname, - "logger": record.name, - "message": record.getMessage(), + "event": record.getMessage(), } - fields = getattr(record, "fields", {}) - if isinstance(fields, dict): - for key, value in fields.items(): - payload[key] = redact_url(str(value)) if key in SENSITIVE_KEYS else value + for key, value in record.__dict__.items(): + if key not in _STANDARD and key not in {"args", "msg"}: + payload[key] = value return json.dumps(payload, default=str, separators=(",", ":")) @@ -39,5 +22,5 @@ def configure_logging(level: str) -> None: handler = logging.StreamHandler() handler.setFormatter(JsonFormatter()) root = logging.getLogger() - root.handlers = [handler] - root.setLevel(level) + root.handlers[:] = [handler] + root.setLevel(level.upper())