""" Logging configuration for Serien-Checker """ import logging import sys from pathlib import Path from datetime import datetime def get_executable_dir() -> Path: """ Get the directory where the executable/script is located Works for both .py and .exe """ if getattr(sys, 'frozen', False): # Running as compiled executable (PyInstaller) return Path(sys.executable).parent else: # Running as script return Path(__file__).parent.parent.parent def setup_logger(name: str = "serien_checker", log_to_file: bool = True, portable: bool = False) -> logging.Logger: """ Setup application logger Args: name: Logger name log_to_file: If True, also log to file portable: If True, use portable mode (logs in program directory) Returns: Configured logger instance """ logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) # Clear existing handlers logger.handlers.clear() # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_format = logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s', datefmt='%H:%M:%S' ) console_handler.setFormatter(console_format) logger.addHandler(console_handler) # File handler if log_to_file: # Check if running as EXE or if portable mode is enabled if getattr(sys, 'frozen', False) or portable: # Running as EXE or portable mode: logs in program directory (next to EXE) log_dir = get_executable_dir() / "logs" else: # Running as script in development: logs in user's AppData log_dir = Path.home() / ".serien_checker" / "logs" log_dir.mkdir(parents=True, exist_ok=True) log_file = log_dir / f"serien_checker_{datetime.now().strftime('%Y%m%d')}.log" file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setLevel(logging.DEBUG) file_format = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) file_handler.setFormatter(file_format) logger.addHandler(file_handler) return logger