| """ |
| 日志管理模块 — 公共模块 |
| """ |
|
|
| 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)) |
|
|