Spaces:
Paused
Paused
File size: 1,986 Bytes
f3ebc82 |
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
"""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)
|