import logging import sys from typing import Optional class ColoredFormatter(logging.Formatter): """Custom formatter with colors for different log levels""" # ANSI color codes GREY = '\033[90m' GREEN = '\033[92m' YELLOW = '\033[93m' RED = '\033[91m' BOLD_RED = '\033[1;91m' RESET = '\033[0m' def format(self, record): # Add color based on log level if record.levelno == logging.DEBUG: color = self.GREY elif record.levelno == logging.INFO: color = self.GREEN elif record.levelno == logging.WARNING: color = self.YELLOW elif record.levelno in (logging.ERROR, logging.CRITICAL): color = self.RED else: color = self.RESET # Format the message with color message = super().format(record) return f"{color}{message}{self.RESET}" def setup_logging(logger_name: str = __name__, log_file: str = 'connection_monitor.log', console_level: int = logging.DEBUG, file_level: int = logging.DEBUG) -> logging.Logger: """ Configure logging with console and file handlers Args: logger_name: Name of the logger log_file: Path to log file console_level: Log level for console output file_level: Log level for file output Returns: Configured logger instance """ logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) # Remove any existing handlers logger.handlers = [] # Console handler with colors console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(console_level) console_handler.setFormatter(ColoredFormatter( '%(asctime)s - %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) # File handler (no colors) file_handler = logging.FileHandler(log_file) file_handler.setLevel(file_level) file_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) # Add both handlers logger.addHandler(console_handler) logger.addHandler(file_handler) return logger def configure_third_party_logging(): """Configure logging for third-party libraries""" try: logging.getLogger('urllib3').setLevel(logging.WARNING) logging.getLogger('requests').setLevel(logging.WARNING) except Exception as e: logging.getLogger(__name__).error(f"Failed to configure additional logging: {e}")