Request-level logging middleware (method/path/status/duration), per-module loggers in routes/services (nearby search radius expansion, 404s, name search), LOG_LEVEL setting wired through docker-compose, and seed_loader converted from print() to logging. Verified: pytest passes, and manually confirmed log lines appear for both successful and 404 requests via `docker compose logs api`. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
28 lines
1,002 B
Python
28 lines
1,002 B
Python
import logging
|
|
from collections.abc import AsyncIterator
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
|
|
from app.api.routes import cities, health, nearby, places
|
|
from app.config import settings
|
|
from app.core.logging import configure_logging, log_requests
|
|
|
|
configure_logging(level=getattr(logging, settings.log_level.upper(), logging.INFO))
|
|
logger = logging.getLogger("guidecity")
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
|
|
logger.info("guideCity API startup complete (log_level=%s)", settings.log_level)
|
|
yield
|
|
logger.info("guideCity API shutting down")
|
|
|
|
|
|
app = FastAPI(title="guideCity API", version="0.1.0", lifespan=lifespan)
|
|
app.middleware("http")(log_requests)
|
|
|
|
app.include_router(health.router, prefix=settings.api_v1_prefix)
|
|
app.include_router(cities.router, prefix=settings.api_v1_prefix)
|
|
app.include_router(places.router, prefix=settings.api_v1_prefix)
|
|
app.include_router(nearby.router, prefix=settings.api_v1_prefix)
|