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

1"""TUI log file routing: rotating file handler that survives the stderr strip.""" 

2 

3from __future__ import annotations 

4 

5import logging 

6from logging.handlers import RotatingFileHandler 

7from pathlib import Path 

8 

9from lilbee.core.config import cfg 

10 

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" 

16 

17 

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 

23 

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 

28 

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