import logging import logging.handlers import os import sys from pathlib import Path def setup_logging(log_level: str = "INFO", log_file: str = None): """Setup application logging configuration""" # Create logs directory if it doesn't exist log_dir = Path("logs") log_dir.mkdir(exist_ok=True) # Set log level numeric_level = getattr(logging, log_level.upper(), None) if not isinstance(numeric_level, int): raise ValueError(f'Invalid log level: {log_level}') # Create formatter formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # Setup root logger root_logger = logging.getLogger() root_logger.setLevel(numeric_level) # Clear existing handlers root_logger.handlers.clear() # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(numeric_level) console_handler.setFormatter(formatter) root_logger.addHandler(console_handler) # File handler if log_file: file_handler = logging.handlers.RotatingFileHandler( log_file, maxBytes=10*1024*1024, # 10MB backupCount=5 ) file_handler.setLevel(numeric_level) file_handler.setFormatter(formatter) root_logger.addHandler(file_handler) # Error file handler error_handler = logging.handlers.RotatingFileHandler( log_dir / "error.log", maxBytes=10*1024*1024, # 10MB backupCount=5 ) error_handler.setLevel(logging.ERROR) error_handler.setFormatter(formatter) root_logger.addHandler(error_handler) # Set specific logger levels for Hugging Face Spaces logging.getLogger("gradio").setLevel(logging.INFO) logging.getLogger("flask").setLevel(logging.INFO) logging.getLogger("werkzeug").setLevel(logging.WARNING) return root_logger def get_logger(name: str): """Get a logger with the specified name""" return logging.getLogger(name) # Setup logging based on environment if __name__ != "__main__": log_level = os.getenv('LOG_LEVEL', 'INFO') log_file = os.getenv('LOG_FILE', 'logs/app.log') setup_logging(log_level, log_file)