Files
plm-lottery/app/logging_config.py
davideandClaude Sonnet 5 7e5c372833 Log to a file instead of only stdout
All app and uvicorn logging now goes to logs/app.log (rotating,
10MB x5), and a catch-all exception handler logs full tracebacks there
before returning a generic 500 — so an error is traceable to its cause
without depending on how the process was launched. logs/ is gitignored,
like the other runtime artifacts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-21 10:46:47 +02:00

29 lines
1.1 KiB
Python

import logging
from logging.handlers import RotatingFileHandler
from pathlib import Path
LOG_DIR = Path(__file__).resolve().parent.parent / "logs"
LOG_FILE = LOG_DIR / "app.log"
_FORMAT = "%(asctime)s %(levelname)s [%(name)s] %(message)s"
def setup_logging() -> None:
"""Route all app + uvicorn logging to logs/app.log so errors are traceable
without depending on however the process happens to be launched."""
LOG_DIR.mkdir(exist_ok=True)
handler = RotatingFileHandler(LOG_FILE, maxBytes=10 * 1024 * 1024, backupCount=5)
handler.setFormatter(logging.Formatter(_FORMAT))
root = logging.getLogger()
root.setLevel(logging.INFO)
root.addHandler(handler)
# "uvicorn.error"/"uvicorn.access" have propagate=False in uvicorn's default
# logging config, so they never reach the root handler above and need their
# own. The parent "uvicorn" logger is deliberately skipped: uvicorn.error
# already bubbles into it, so attaching there too would double every line.
for logger_name in ("uvicorn.error", "uvicorn.access"):
logging.getLogger(logger_name).addHandler(handler)