Establishes foundation for migrating baseball simulation from Discord bot to web application using service-oriented architecture pattern. Key components: - FastAPI application structure with dependency injection - Service layer foundation with base classes and container - Comprehensive directory documentation with README files - PostgreSQL containerization with Docker Compose - Testing structure for unit/integration/e2e tests - Migration planning documentation - Rotating log configuration per user requirements Architecture follows Model/Service/Controller pattern to improve testability, maintainability, and scalability over original monolithic Discord app. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
"""
|
|
Logging configuration with rotating file handlers.
|
|
Follows user's CLAUDE.md requirements for rotating loggers.
|
|
"""
|
|
|
|
import logging
|
|
import logging.handlers
|
|
import os
|
|
from pathlib import Path
|
|
|
|
|
|
def setup_logging(
|
|
level: int = logging.INFO,
|
|
max_bytes: int = 10 * 1024 * 1024, # 10MB
|
|
backup_count: int = 5
|
|
) -> None:
|
|
"""
|
|
Set up rotating file logging for the application.
|
|
|
|
Args:
|
|
level: Logging level (default: INFO)
|
|
max_bytes: Maximum bytes per log file before rotation
|
|
backup_count: Number of backup files to keep
|
|
"""
|
|
# Create logs directory if it doesn't exist
|
|
log_dir = Path("logs")
|
|
log_dir.mkdir(exist_ok=True)
|
|
|
|
# Configure root logger
|
|
root_logger = logging.getLogger()
|
|
root_logger.setLevel(level)
|
|
|
|
# Remove existing handlers to avoid duplicates
|
|
for handler in root_logger.handlers[:]:
|
|
root_logger.removeHandler(handler)
|
|
|
|
# Console handler for development
|
|
console_handler = logging.StreamHandler()
|
|
console_formatter = logging.Formatter(
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
console_handler.setFormatter(console_formatter)
|
|
root_logger.addHandler(console_handler)
|
|
|
|
# Rotating file handler
|
|
file_handler = logging.handlers.RotatingFileHandler(
|
|
filename=log_dir / "paper_dynasty.log",
|
|
maxBytes=max_bytes,
|
|
backupCount=backup_count
|
|
)
|
|
file_formatter = logging.Formatter(
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s'
|
|
)
|
|
file_handler.setFormatter(file_formatter)
|
|
root_logger.addHandler(file_handler)
|
|
|
|
# Set specific logger levels
|
|
logging.getLogger("uvicorn").setLevel(logging.INFO)
|
|
logging.getLogger("sqlalchemy").setLevel(logging.WARNING)
|
|
|
|
logger = logging.getLogger(f'{__name__}.setup_logging')
|
|
logger.info("Logging configuration completed") |