import logging from logging.handlers import RotatingFileHandler import os from datetime import datetime def setup_logger(name: str, log_dir: str = "logs", log_type: str = 'both') -> logging.Logger: """ Set up a logger with both file and console handlers. Args: name: Name of the logger (usually __name__) log_dir: Directory to store log files log_type: Type of log to write to file ('both', 'file', 'console') """ # Create logger logger = logging.getLogger(name) logger.setLevel(logging.INFO) date_format = '%Y-%m-%d %H:%M:%S' if log_type == 'both': log_to_file = True log_to_console = True elif log_type == 'file': log_to_file = True log_to_console = False elif log_type == 'console': log_to_file = False log_to_console = True else: raise ValueError(f"Invalid log type: {log_type}") if log_to_file: # Create logs directory if it doesn't exist os.makedirs(log_dir, exist_ok=True) # Create formatters file_formatter = logging.Formatter( '%(asctime)s | %(levelname)s | %(name)s | %(funcName)s | %(message)s', datefmt=date_format ) # File handler (rotating) file_handler = RotatingFileHandler( filename=os.path.join(log_dir, f"{datetime.now().strftime('%Y-%m-%d')}.log"), maxBytes=10*1024*1024, # 10MB backupCount=5 ) file_handler.setLevel(logging.INFO) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) if log_to_console: console_formatter = logging.Formatter( '%(asctime)s | %(levelname)s | %(message)s', datefmt=date_format ) # Console handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) return logger