Files
Gondulf/src/gondulf/logging_config.py
Phil Skentelbery bebd47955f feat(core): implement Phase 1 foundation infrastructure
Implements Phase 1 Foundation with all core services:

Core Components:
- Configuration management with GONDULF_ environment variables
- Database layer with SQLAlchemy and migration system
- In-memory code storage with TTL support
- Email service with SMTP and TLS support (STARTTLS + implicit TLS)
- DNS service with TXT record verification
- Structured logging with Python standard logging
- FastAPI application with health check endpoint

Database Schema:
- authorization_codes table for OAuth 2.0 authorization codes
- domains table for domain verification
- migrations table for tracking schema versions
- Simple sequential migration system (001_initial_schema.sql)

Configuration:
- Environment-based configuration with validation
- .env.example template with all GONDULF_ variables
- Fail-fast validation on startup
- Sensible defaults for optional settings

Testing:
- 96 comprehensive tests (77 unit, 5 integration)
- 94.16% code coverage (exceeds 80% requirement)
- All tests passing
- Test coverage includes:
  - Configuration loading and validation
  - Database migrations and health checks
  - In-memory storage with expiration
  - Email service (STARTTLS, implicit TLS, authentication)
  - DNS service (TXT records, domain verification)
  - Health check endpoint integration

Documentation:
- Implementation report with test results
- Phase 1 clarifications document
- ADRs for key decisions (config, database, email, logging)

Technical Details:
- Python 3.10+ with type hints
- SQLite with configurable database URL
- System DNS with public DNS fallback
- Port-based TLS detection (465=SSL, 587=STARTTLS)
- Lazy configuration loading for testability

Exit Criteria Met:
✓ All foundation services implemented
✓ Application starts without errors
✓ Health check endpoint operational
✓ Database migrations working
✓ Test coverage exceeds 80%
✓ All tests passing

Ready for Architect review and Phase 2 development.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 12:21:42 -07:00

58 lines
1.6 KiB
Python

"""
Logging configuration for Gondulf IndieAuth server.
Provides structured logging with consistent format across all modules.
Uses Python's standard logging module with configurable levels.
"""
import logging
import sys
def configure_logging(log_level: str = "INFO", debug: bool = False) -> None:
"""
Configure application logging.
Sets up structured logging format and level for all Gondulf modules.
Logs to stdout/stderr for container-friendly output.
Args:
log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
debug: If True, overrides log_level to DEBUG
"""
# Determine effective log level
effective_level = "DEBUG" if debug else log_level
# Configure root logger
logging.basicConfig(
level=effective_level,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
stream=sys.stdout,
force=True, # Override any existing configuration
)
# Set level for gondulf modules specifically
gondulf_logger = logging.getLogger("gondulf")
gondulf_logger.setLevel(effective_level)
# Reduce noise from third-party libraries in production
if not debug:
logging.getLogger("urllib3").setLevel(logging.WARNING)
logging.getLogger("sqlalchemy").setLevel(logging.WARNING)
logging.info(f"Logging configured: level={effective_level}")
def get_logger(name: str) -> logging.Logger:
"""
Get a logger instance for a module.
Args:
name: Logger name (typically __name__ from calling module)
Returns:
Configured logger instance
"""
return logging.getLogger(name)