Spaces:
Running
Running

Add logging functionality to app.py and blob_utils.py for improved traceability and debugging
6c983cf
""" | |
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__) | |