import logging import sys from pathlib import Path from datetime import datetime from typing import Optional class ColoredFormatter(logging.Formatter): COLORS = { 'DEBUG': '\033[94m', 'INFO': '\033[92m', 'WARNING': '\033[93m', 'ERROR': '\033[91m', 'CRITICAL': '\033[95m', 'RESET': '\033[0m' } def format(self, record): log_color = self.COLORS.get(record.levelname, self.COLORS['RESET']) reset_color = self.COLORS['RESET'] record.levelname = f"{log_color}{record.levelname}{reset_color}" return super().format(record) def setup_logging(level: str = "INFO", log_file: Optional[str] = None) -> logging.Logger: log_level = getattr(logging, level.upper(), logging.INFO) logger = logging.getLogger("newmusic") logger.setLevel(log_level) if logger.handlers: logger.handlers.clear() console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(log_level) console_formatter = ColoredFormatter( fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) if log_file: log_path = Path(log_file) log_path.parent.mkdir(parents=True, exist_ok=True) file_handler = logging.FileHandler(log_path) file_handler.setLevel(log_level) 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) logger.addHandler(file_handler) logger.info(f"Logging initialized with level: {level}") return logger def get_logger(name: str) -> logging.Logger: return logging.getLogger(f"newmusic.{name}") main_logger = get_logger("main")