"""Logging configuration.""" import logging import sys from contextvars import ContextVar request_id_var: ContextVar[str] = ContextVar("request_id", default="") def configure_logging(log_level: str = "INFO") -> None: """Configure structured logging.""" handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - [%(request_id)s] %(message)s" ) handler.setFormatter(formatter) handler.addFilter(RequestIdFilter()) root_logger = logging.getLogger() root_logger.setLevel(getattr(logging, log_level.upper(), logging.INFO)) root_logger.handlers = [] root_logger.addHandler(handler) # Reduce noise from third-party libraries logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING) logging.getLogger("uvicorn.access").setLevel(logging.WARNING) class RequestIdFilter(logging.Filter): """Inject request_id into log records.""" def filter(self, record: logging.LogRecord) -> bool: record.request_id = request_id_var.get() # type: ignore[attr-defined] return True def get_logger(name: str) -> logging.Logger: """Get a logger with request_id filter.""" logger = logging.getLogger(name) logger.addFilter(RequestIdFilter()) return logger