""" logging_setup.py — consistent logging config """ from __future__ import annotations import logging import os from datetime import datetime from pathlib import Path from typing import Optional _DEFAULT_FMT = "%(asctime)s [%(levelname)s] %(name)s: %(message)s" def setup_logging(level: Optional[str] = None, *, to_file: bool = True) -> None: """ Initialize root logger once. Level may be 'DEBUG'|'INFO'|'WARNING'|'ERROR'. Falls back to env LOG_LEVEL or INFO. Optionally write to logs/YYYY-MM-DD.log. """ if getattr(setup_logging, "_configured", False): return lvl = (level or os.getenv("LOG_LEVEL") or "INFO").upper() logging.basicConfig(level=getattr(logging, lvl, logging.INFO), format=_DEFAULT_FMT) if to_file: logdir = Path("_out/logs") logdir.mkdir(parents=True, exist_ok=True) logfile = logdir / f"{datetime.now().strftime('%Y-%m-%d')}.log" fh = logging.FileHandler(logfile, encoding="utf-8") fh.setFormatter(logging.Formatter(_DEFAULT_FMT)) root = logging.getLogger() root.addHandler(fh) logging.info(f"File logging → {logfile}") setup_logging._configured = True # type: ignore[attr-defined]