Spaces:
Running on Zero
Running on Zero
File size: 1,232 Bytes
e726170 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | """Structured logging helpers for the GCMD classifier MVP."""
from __future__ import annotations
import logging
from typing import Any
_SECRET_MARKERS = ("api_key", "apikey", "authorization", "token", "secret", "password", "header")
def get_logger(name: str = "gcmd_classifier") -> logging.Logger:
"""Return a package logger without forcing global logging configuration."""
return logging.getLogger(name)
def sanitize_log_details(details: dict[str, Any]) -> dict[str, Any]:
"""Remove values whose keys look like secrets or sensitive headers."""
sanitized: dict[str, Any] = {}
for key, value in details.items():
lowered = key.lower()
if any(marker in lowered for marker in _SECRET_MARKERS):
sanitized[key] = "[REDACTED]"
elif isinstance(value, dict):
sanitized[key] = sanitize_log_details(value)
else:
sanitized[key] = value
return sanitized
def log_event(logger: logging.Logger, event: str, **details: Any) -> None:
"""Emit a structured event through standard logging without secrets."""
safe_details = sanitize_log_details(details)
logger.info("gcmd_classifier_event", extra={"event": event, "details": safe_details})
|