import os import logging from logging.handlers import RotatingFileHandler import sys # Create logs directory if it doesn't exist logs_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs') os.makedirs(logs_dir, exist_ok=True) # Log file path log_file_path = os.path.join(logs_dir, 'deblur_app.log') # Keep track of configured loggers to prevent duplicate setup _configured_loggers = set() def setup_logger(name=None): """ Setup and return a logger configured to log to both file and console Args: name: Logger name (default: root logger) Returns: Configured logger instance """ global _configured_loggers # Get or create the logger logger = logging.getLogger(name) # Check if this logger has already been configured logger_id = id(logger) if logger_id in _configured_loggers or logger.handlers: return logger # Add to configured loggers set _configured_loggers.add(logger_id) # Set log level logger.setLevel(logging.INFO) # Prevent propagation to avoid duplicate logs logger.propagate = False # Create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # File handler (with rotation) file_handler = RotatingFileHandler( log_file_path, maxBytes=10*1024*1024, # 10 MB backupCount=5 ) file_handler.setLevel(logging.INFO) file_handler.setFormatter(formatter) # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_handler.setFormatter(formatter) # Add handlers to logger logger.addHandler(file_handler) logger.addHandler(console_handler) return logger # Configure root logger only once if not logging.getLogger().handlers: setup_logger()