Scaffold all modules, route stubs, data models, and config. No logic implemented yet — all core methods raise NotImplementedError. Establishes the full directory layout matching the architecture in CLAUDE.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
36 lines
1.0 KiB
Python
36 lines
1.0 KiB
Python
"""
|
|
Logging setup for Fellowship.
|
|
Call setup_logging() once at startup. All modules use standard logging.getLogger(__name__).
|
|
Logs are written to logs/{YYYY-MM-DD}.log and to stdout in debug mode.
|
|
"""
|
|
|
|
import logging
|
|
import logging.handlers
|
|
import os
|
|
from datetime import date
|
|
|
|
|
|
def setup_logging() -> None:
|
|
os.makedirs("logs", exist_ok=True)
|
|
|
|
log_file = f"logs/{date.today().isoformat()}.log"
|
|
formatter = logging.Formatter(
|
|
fmt="%(asctime)s [%(levelname)s] %(name)s — %(message)s",
|
|
datefmt="%Y-%m-%dT%H:%M:%S",
|
|
)
|
|
|
|
file_handler = logging.handlers.TimedRotatingFileHandler(
|
|
log_file, when="midnight", backupCount=30, encoding="utf-8"
|
|
)
|
|
file_handler.setFormatter(formatter)
|
|
file_handler.setLevel(logging.DEBUG)
|
|
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setFormatter(formatter)
|
|
console_handler.setLevel(logging.DEBUG)
|
|
|
|
root = logging.getLogger()
|
|
root.setLevel(logging.DEBUG)
|
|
root.addHandler(file_handler)
|
|
root.addHandler(console_handler)
|