File size: 2,657 Bytes
9f3385c | 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | """
Centralized logging setup for the project.
Usage β call once at the very start of any entry point:
from utils.logger import setup_logging
setup_logging()
Then in any module just use:
import logging
logger = logging.getLogger(__name__)
logger.info("...")
"""
import logging
import sys
from pathlib import Path
from datetime import datetime
# ββ Constants ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
LOG_DIR = Path("logs")
LOG_FMT = "%(asctime)s %(levelname)-8s [%(name)s] %(message)s"
DATE_FMT = "%Y-%m-%d %H:%M:%S"
def setup_logging(
level: int = logging.INFO,
log_dir: Path = LOG_DIR,
filename: str | None = None,
) -> None:
"""
Configure root logger to stream to both terminal and a rotating log file.
Args:
level: logging level (default: INFO)
log_dir: directory where log files are stored (default: logs/)
filename: log file name (default: YYYY-MM-DD_HH-MM-SS.log)
"""
log_dir.mkdir(parents=True, exist_ok=True)
if filename is None:
filename = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".log"
log_path = log_dir / filename
formatter = logging.Formatter(fmt=LOG_FMT, datefmt=DATE_FMT)
# ββ Terminal handler βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(formatter)
stream_handler.setLevel(level)
# ββ File handler βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
file_handler = logging.FileHandler(log_path, encoding="utf-8")
file_handler.setFormatter(formatter)
file_handler.setLevel(level)
# ββ Root logger ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
root = logging.getLogger()
root.setLevel(level)
# Avoid adding duplicate handlers if called more than once
if not root.handlers:
root.addHandler(stream_handler)
root.addHandler(file_handler)
else:
root.handlers.clear()
root.addHandler(stream_handler)
root.addHandler(file_handler)
logging.info("Logging initialised β %s", log_path) |