"""Console / file logging setup.""" import logging import sys from pathlib import Path from typing import Optional def setup_logging( log_dir: Optional[str] = None, level: int = logging.INFO, log_file: Optional[str] = None, ): """ Configure root logging: Rich console if available, optional UTF-8 file handler. Args: log_dir: Directory for log files (created if missing). level: Root log level. log_file: Filename inside log_dir (default: easytranslate.log). """ root_logger = logging.getLogger() root_logger.setLevel(level) for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) fmt = logging.Formatter( "[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) try: from rich.logging import RichHandler console_handler = RichHandler(rich_tracebacks=True, markup=True) console_handler.setLevel(level) console_handler.setFormatter(logging.Formatter("%(message)s")) root_logger.addHandler(console_handler) except ImportError: console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(level) console_handler.setFormatter(fmt) root_logger.addHandler(console_handler) if log_dir is not None: log_dir = Path(log_dir) log_dir.mkdir(parents=True, exist_ok=True) file_name = log_file or "easytranslate.log" file_handler = logging.FileHandler(log_dir / file_name, encoding="utf-8") file_handler.setLevel(level) file_handler.setFormatter(fmt) root_logger.addHandler(file_handler) logging.getLogger("matplotlib").setLevel(logging.WARNING) logging.getLogger("PIL").setLevel(logging.WARNING) root_logger.info("Logging initialized (level=%s)", logging.getLevelName(level))