Python 64.6%
TypeScript 33.7%
CSS 0.8%
1"""structlog configuration. Never log message contents (Loi 25)."""23from __future__ import annotations45import logging6import sys78import structlog910REDACT_KEYS = {"content", "message", "text", "code", "prompt", "email", "authorization"}111213def _redact(_: object, __: str, event_dict: dict) -> dict:14 for key in list(event_dict):15 if key.lower() in REDACT_KEYS:16 value = event_dict[key]17 event_dict[key] = f"<redacted len={len(str(value))}>"18 return event_dict192021def configure_logging(level: str = "INFO", json_output: bool = True) -> None:22 logging.basicConfig(level=level, stream=sys.stdout, format="%(message)s")23 renderer = structlog.processors.JSONRenderer() if json_output else structlog.dev.ConsoleRenderer()24 structlog.configure(25 processors=[26 structlog.contextvars.merge_contextvars,27 structlog.processors.add_log_level,28 structlog.processors.TimeStamper(fmt="iso"),29 _redact,30 renderer,31 ],32 wrapper_class=structlog.make_filtering_bound_logger(getattr(logging, level.upper(), 20)),33 logger_factory=structlog.PrintLoggerFactory(),34 cache_logger_on_first_use=True,35 )363738def get_logger(name: str) -> structlog.stdlib.BoundLogger:39 return structlog.get_logger(name)40