""" Logging configuration for the detection demo application. Provides centralized logging setup with proper formatting and levels. """ import logging import sys from pathlib import Path class LoggerManager: """Singleton logger manager for the application.""" _instance = None _initialized = False def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def __init__(self): if not self._initialized: self._setup_default_logging() self._initialized = True def _setup_default_logging(self): """Setup default logging configuration.""" # Create main logger self.logger = logging.getLogger("detection-demo") self.logger.setLevel(logging.INFO) # Prevent duplicate handlers if self.logger.handlers: return # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_formatter = logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%H:%M:%S", ) console_handler.setFormatter(console_formatter) self.logger.addHandler(console_handler) # File handler (logs/app.log) log_file = Path("logs/app.log") log_file.parent.mkdir(parents=True, exist_ok=True) file_handler = logging.FileHandler(log_file) file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) file_handler.setFormatter(file_formatter) self.logger.addHandler(file_handler) def get_logger(self, name: str = None) -> logging.Logger: """Get a logger instance.""" if name: return logging.getLogger(f"detection-demo.{name}") return self.logger # Global logger manager instance _logger_manager = LoggerManager() def get_logger(name: str = None) -> logging.Logger: """ Get a logger instance for the application. Args: name: Optional module name (will be prefixed with app name) Returns: Logger instance """ return _logger_manager.get_logger(name) # Module-level logger logger = get_logger(__name__)