detection-demo / logging_config.py
kevinconka's picture
Add logging functionality to app.py and blob_utils.py for improved traceability and debugging
6c983cf
raw
history blame
2.43 kB
"""
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__)