""" Configuration structlog — logging structuré JSON/Console. En production (DEBUG=False) : JSON pour les agrégateurs (ELK, Datadog, etc.) En développement (DEBUG=True) : Console colorée lisible. """ import logging import sys import structlog def configure_logging(debug: bool = False) -> None: """Configure structlog + stdlib logging.""" shared_processors = [ structlog.contextvars.merge_contextvars, structlog.stdlib.add_log_level, structlog.stdlib.add_logger_name, structlog.stdlib.ExtraAdder(), structlog.processors.TimeStamper(fmt="iso"), structlog.processors.StackInfoRenderer(), structlog.processors.UnicodeDecoder(), ] if debug: # Console lisible en dev renderer = structlog.dev.ConsoleRenderer(colors=True) else: # JSON en production renderer = structlog.processors.JSONRenderer() structlog.configure( processors=[ *shared_processors, structlog.stdlib.ProcessorFormatter.wrap_for_formatter, ], logger_factory=structlog.stdlib.LoggerFactory(), wrapper_class=structlog.stdlib.BoundLogger, cache_logger_on_first_use=True, ) formatter = structlog.stdlib.ProcessorFormatter( processor=renderer, foreign_pre_chain=shared_processors, ) handler = logging.StreamHandler(sys.stdout) handler.setFormatter(formatter) root_logger = logging.getLogger() root_logger.handlers.clear() root_logger.addHandler(handler) root_logger.setLevel(logging.DEBUG if debug else logging.INFO) # Réduire le bruit des librairies tierces logging.getLogger("uvicorn.access").setLevel(logging.WARNING) logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING) logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("httpcore").setLevel(logging.WARNING)