""" 日志管理模块 — 公共模块 """ 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, ): """ 配置日志系统。 Args: log_dir: 日志目录路径 level: 日志级别 log_file: 日志文件名 (相对于 log_dir) """ 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))