Initial project structure
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>
This commit is contained in:
35
fellowship/logger.py
Normal file
35
fellowship/logger.py
Normal file
@@ -0,0 +1,35 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user