grant-radar / src /analyzer /logging_setup.py
Riley Coleman
Initial commit of grant-analyst project
19de729
Raw
History Blame Contribute Delete
1.22 kB
"""
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]