import logging import os import sys from typing import Optional def setup_logger( logger_name: str = None, log_level: int = logging.INFO, log_format: Optional[str] = None, log_file: Optional[str] = None, console_output: bool = True ) -> logging.Logger: """ Set up a logger with the specified configuration Args: logger_name: Name of the logger (uses root logger if None) log_level: Logging level (default: INFO) log_format: Custom log format (uses default if None) log_file: Path to log file (logs to file if provided) console_output: Whether to output logs to console Returns: Configured logger instance """ # Get logger logger = logging.getLogger(logger_name) logger.setLevel(log_level) # Clear existing handlers if any if logger.handlers: for handler in logger.handlers[:]: logger.removeHandler(handler) # Default log format if log_format is None: log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' formatter = logging.Formatter(log_format) # Add file handler if log file is specified if log_file: # Ensure directory exists log_dir = os.path.dirname(log_file) if log_dir and not os.path.exists(log_dir): os.makedirs(log_dir) file_handler = logging.FileHandler(log_file) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # Add console handler if enabled if console_output: console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(formatter) logger.addHandler(console_handler) return logger