"""Central logging setup: console + rotating file, no print() anywhere.""" from __future__ import annotations import logging import logging.handlers from pathlib import Path _FORMAT = "%(asctime)s %(levelname)-7s %(name)s: %(message)s" def setup_logging(level: str = "INFO", data_dir: "Path | None" = None) -> None: root = logging.getLogger() if root.handlers: # already configured (tests, reload) return root.setLevel(getattr(logging, level.upper(), logging.INFO)) console = logging.StreamHandler() console.setFormatter(logging.Formatter(_FORMAT)) root.addHandler(console) if data_dir is not None: log_dir = Path(data_dir) / "logs" log_dir.mkdir(parents=True, exist_ok=True) fileh = logging.handlers.RotatingFileHandler( log_dir / "behavision.log", maxBytes=5_000_000, backupCount=3, encoding="utf-8") fileh.setFormatter(logging.Formatter(_FORMAT)) root.addHandler(fileh)