From d6cdf482e467e3e10c65cb2639523462d5a39931 Mon Sep 17 00:00:00 2001 From: alexion Date: Mon, 7 Sep 2026 14:45:09 -0400 Subject: [PATCH] refactor(clew): configure logging at startup --- src/clew/clew.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/clew/clew.py b/src/clew/clew.py index 9c03aa8..c616c7c 100644 --- a/src/clew/clew.py +++ b/src/clew/clew.py @@ -5,6 +5,7 @@ import logging import os import shutil import sys +from datetime import UTC, datetime from pathlib import Path from rpycdec.rpa import extract_rpa @@ -58,7 +59,8 @@ def prepare_output(output_root: Path, overwrite: bool) -> Path: for name in MANAGED_DIRS: path = output_root / name if path.exists() and not overwrite: - raise SystemExit(f"clew: refusing to overwrite existing output path: {path}") + LOGGER.critical("refusing to overwrite existing output path: %s", path) + raise SystemExit(2) if overwrite: for name in MANAGED_DIRS: @@ -78,7 +80,8 @@ def normalize_suffixes(suffixes: list[str] | None) -> list[str] | None: normalized = [] for suffix in suffixes: if not suffix: - raise SystemExit("clew: suffix must not be empty") + LOGGER.critical("suffix must not be empty") + raise SystemExit(2) if not suffix.startswith("."): suffix = f".{suffix}" normalized.append(suffix) @@ -109,8 +112,22 @@ def extract_archive( LOGGER.info("extracted archive: %s", archive_relative) -def configure_logging() -> None: - logging.basicConfig(level=logging.INFO, format="%(message)s") +def configure_logging(output_root: Path) -> None: + log_level = logging.INFO + timestamp = datetime.now(UTC).strftime("%Y%m%dT%H%M%SZ") + logs_dir = output_root / "logs" + logs_dir.mkdir(parents=True, exist_ok=True) + log_file = logs_dir / f"{logging.getLevelName(log_level)}-clew-{timestamp}.log" + + formatter = logging.Formatter("%(message)s") + + file_handler = logging.FileHandler(log_file, encoding="utf-8") + file_handler.setFormatter(formatter) + + stream_handler = logging.StreamHandler() + stream_handler.setFormatter(formatter) + + logging.basicConfig(level=log_level, handlers=[file_handler, stream_handler]) def run(args: argparse.Namespace) -> None: @@ -118,10 +135,10 @@ def run(args: argparse.Namespace) -> None: output_root = resolve_output_root(args.output_root) if not game_root.is_dir(): - raise SystemExit(f"clew: game root is not a directory: {game_root}") + LOGGER.critical("game root is not a directory: %s", game_root) + raise SystemExit(2) suffixes = normalize_suffixes(args.suffix) - configure_logging() extracted_dir = prepare_output(output_root, args.overwrite) LOGGER.info("copying loose files") @@ -138,4 +155,5 @@ def run(args: argparse.Namespace) -> None: if __name__ == "__main__": args = parse_args(sys.argv[1:]) + configure_logging(resolve_output_root(args.output_root)) run(args)