Coverage for src / lilbee / cli / tui / log_routing.py: 100%
23 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-05-15 20:55 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-05-15 20:55 +0000
1"""TUI log file routing: rotating file handler that survives the stderr strip."""
3from __future__ import annotations
5import logging
6from logging.handlers import RotatingFileHandler
7from pathlib import Path
9from lilbee.core.config import cfg
11_TUI_LOG_DIR_NAME = "logs"
12_TUI_LOG_FILE_NAME = "tui.log"
13_MAX_BYTES = 1_048_576 # 1 MiB
14_BACKUP_COUNT = 5
15_LOG_FORMAT = "%(asctime)s %(levelname)s %(name)s: %(message)s"
18def setup_tui_log_file() -> Path:
19 """Install a RotatingFileHandler at ``cfg.data_root/logs/tui.log``. Idempotent."""
20 log_dir = cfg.data_root / _TUI_LOG_DIR_NAME
21 log_dir.mkdir(parents=True, exist_ok=True)
22 log_path = log_dir / _TUI_LOG_FILE_NAME
24 root = logging.getLogger()
25 for handler in root.handlers:
26 if isinstance(handler, RotatingFileHandler) and Path(handler.baseFilename) == log_path:
27 return log_path
29 handler = RotatingFileHandler(log_path, maxBytes=_MAX_BYTES, backupCount=_BACKUP_COUNT)
30 handler.setFormatter(logging.Formatter(_LOG_FORMAT))
31 handler.setLevel(logging.WARNING)
32 root.addHandler(handler)
33 return log_path