# utils/logger.py import logging from datetime import datetime from pathlib import Path from typing import Optional class SupersetLogger: def __init__( self, name: str = "superset_tool", log_dir: Optional[Path] = None, level: int = logging.INFO, console: bool = True ): self.logger = logging.getLogger(name) self.logger.setLevel(level) formatter = logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' ) # Очищаем существующие обработчики if self.logger.handlers: for handler in self.logger.handlers[:]: self.logger.removeHandler(handler) # Файловый обработчик if log_dir: log_dir.mkdir(parents=True, exist_ok=True) file_handler = logging.FileHandler( log_dir / f"{name}_{self._get_timestamp()}.log" ) file_handler.setFormatter(formatter) self.logger.addHandler(file_handler) # Консольный обработчик if console: console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) self.logger.addHandler(console_handler) def _get_timestamp(self) -> str: return datetime.now().strftime("%Y%m%d") def info(self, message: str, extra: Optional[dict] = None, exc_info: bool = False): self.logger.info(message, extra=extra, exc_info=exc_info) def error(self, message: str, extra: Optional[dict] = None, exc_info: bool = False): self.logger.error(message, extra=extra, exc_info=exc_info) def warning(self, message: str, extra: Optional[dict] = None, exc_info: bool = False): self.logger.warning(message, extra=extra, exc_info=exc_info) def critical(self, message: str, extra: Optional[dict] = None, exc_info: bool = False): self.logger.critical(message, extra=extra, exc_info=exc_info) def debug(self, message: str, extra: Optional[dict] = None, exc_info: bool = False): self.logger.debug(message, extra=extra, exc_info=exc_info) def exception(self, message: str): self.logger.exception(message)