File size: 1,222 Bytes
59ebe66
 
 
 
 
 
19de729
 
59ebe66
 
19de729
59ebe66
19de729
59ebe66
 
 
19de729
59ebe66
 
 
19de729
59ebe66
 
19de729
 
 
 
 
 
 
 
 
 
 
59ebe66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""
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]