SpotMaster_v1.0 / utils /logger.py
Marek4321's picture
Create logger.py
ef28b60 verified
# @title utils/logger.py
import logging
import sys
from datetime import datetime
from pathlib import Path
from typing import Optional, Dict, Any, Callable
class SpotMakerLogger:
"""
Logger dla aplikacji SpotMaker.
Obs艂uguje:
- Logowanie do pliku i konsoli
- 艢ledzenie post臋pu dla GUI
- Logowanie szczeg贸艂owe dla ka偶dego modu艂u
"""
def __init__(self, log_dir: str = "logs"):
self.log_dir = Path(log_dir)
self.log_dir.mkdir(parents=True, exist_ok=True)
# Inicjalizacja g艂贸wnego loggera
self.logger = logging.getLogger('SpotMaker')
self.logger.setLevel(logging.DEBUG)
# Format log贸w
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# Handler dla pliku
file_handler = logging.FileHandler(
self.log_dir / f"spotmaker_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log",
encoding='utf-8'
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
# Handler dla konsoli
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler)
# Stan dla GUI
self.current_progress: Dict[str, float] = {}
self.current_status: Dict[str, str] = {}
# Callback dla aktualizacji UI
self.update_ui_callback: Optional[Callable] = None
def log(self, module: str, message: str, level: str = "info") -> None:
"""
Loguje wiadomo艣膰 z okre艣lonego modu艂u.
Args:
module: Nazwa modu艂u (np. 'video_gen', 'audio_gen')
message: Tre艣膰 wiadomo艣ci
level: Poziom logowania ('debug', 'info', 'warning', 'error', 'critical')
"""
log_method = getattr(self.logger, level.lower())
formatted_msg = f"[{module}] {message}"
log_method(formatted_msg)
# Aktualizacja interfejsu je艣li zdefiniowano callback
if self.update_ui_callback:
self.update_ui_callback(formatted_msg)
def update_progress(self, module: str, progress: float, status: Optional[str] = None) -> Dict[str, Any]:
"""
Aktualizuje post臋p operacji dla danego modu艂u.
Args:
module: Nazwa modu艂u
progress: Warto艣膰 post臋pu (0-100)
status: Opcjonalny status tekstowy
Returns:
Dict zawieraj膮cy aktualny stan dla GUI
"""
self.current_progress[module] = min(max(progress, 0), 100)
if status:
self.current_status[module] = status
self.log(module, f"Status: {status} | Post臋p: {progress:.1f}%")
return {
'progress': self.current_progress,
'status': self.current_status
}
def get_module_progress(self, module: str) -> float:
"""Zwraca aktualny post臋p dla danego modu艂u."""
return self.current_progress.get(module, 0.0)
def get_module_status(self, module: str) -> str:
"""Zwraca aktualny status dla danego modu艂u."""
return self.current_status.get(module, "Nieaktywny")
def reset_module(self, module: str) -> None:
"""Resetuje post臋p i status dla danego modu艂u."""
self.current_progress[module] = 0.0
self.current_status[module] = "Zresetowano"
self.log(module, "Zresetowano stan modu艂u")
def format_error(self, module: str, error: Exception) -> str:
"""
Formatuje b艂膮d do logowania.
Args:
module: Nazwa modu艂u
error: Obiekt wyj膮tku
Returns:
Sformatowana wiadomo艣膰 b艂臋du
"""
error_msg = f"[{module}] B艂膮d: {str(error)}"
self.logger.error(error_msg)
return error_msg
def set_ui_callback(self, callback_fn: Callable[[str], None]) -> None:
"""Ustawia funkcj臋 callback do aktualizacji interfejsu."""
self.update_ui_callback = callback_fn