"""Centralized logging configuration for FDAM AI Pipeline. Provides structured logging for HuggingFace Spaces troubleshooting. Set LOG_LEVEL=DEBUG for detailed output. """ import logging import sys from typing import Literal LogLevel = Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] def setup_logging(level: LogLevel = "INFO") -> None: """Configure structured logging for FDAM Pipeline. Args: level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL). DEBUG provides detailed inference timing and RAG scores. INFO provides pipeline stage progress. WARNING and above for production. """ log_format = "[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s" date_format = "%Y-%m-%d %H:%M:%S" # Configure root logger logging.basicConfig( level=getattr(logging, level.upper(), logging.INFO), format=log_format, datefmt=date_format, handlers=[logging.StreamHandler(sys.stdout)], force=True, # Override any existing config ) # Reduce noise from third-party libraries logging.getLogger("chromadb").setLevel(logging.WARNING) logging.getLogger("transformers").setLevel(logging.WARNING) logging.getLogger("gradio").setLevel(logging.WARNING) logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("httpcore").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("PIL").setLevel(logging.WARNING) # Log the logging configuration itself logger = logging.getLogger(__name__) logger.info(f"Logging initialized at {level} level") def get_logger(name: str) -> logging.Logger: """Get a logger with the given name. Convenience function for consistent logger creation. Args: name: Logger name (typically __name__ of the calling module). Returns: Configured logger instance. """ return logging.getLogger(name)