ShawnYue
Person E: utils, experiment scripts, report figure generator; omit HF-rejected binaries
f102f56 | """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)) | |