From d3ce1ceed8949a549ff3db1b8551a65a8060ee8b Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 14 Apr 2025 13:18:30 +0100 Subject: [PATCH] added more detailed logging to help catch errors --- backend/app/main.py | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/backend/app/main.py b/backend/app/main.py index a7dfe279..de6f0795 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,12 +1,55 @@ -from fastapi import FastAPI, Depends +import logging +from fastapi.responses import JSONResponse +from fastapi import FastAPI, Depends, Request, status +from fastapi.exceptions import RequestValidationError +from fastapi.encoders import jsonable_encoder +from starlette.exceptions import HTTPException as StarletteHTTPException from mangum import Mangum from backend.app.portfolio import router as portfolio_router from backend.app.plan import router as plan_router from backend.app.dependencies import validate_api_key from backend.app.config import get_settings +logger = logging.getLogger("uvicorn.error") +logging.basicConfig(level=logging.INFO) + app = FastAPI(dependencies=[Depends(validate_api_key)]) + +# Handle 422 errors (validation failures) +@app.exception_handler(RequestValidationError) +async def validation_exception_handler(request: Request, exc: RequestValidationError): + logger.error(f"422 Validation Error at {request.url}") + logger.error(f"Body: {exc.body}") + logger.error(f"Validation Errors: {exc.errors()}") + return JSONResponse( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + content=jsonable_encoder({ + "detail": exc.errors(), + "body": exc.body + }), + ) + + +# Handle generic HTTP exceptions (optional, useful for catching 404, 403, etc.) +@app.exception_handler(StarletteHTTPException) +async def http_exception_handler(request: Request, exc: StarletteHTTPException): + logger.warning(f"{exc.status_code} Error at {request.url} - Detail: {exc.detail}") + return JSONResponse( + status_code=exc.status_code, + content={"detail": exc.detail}, + ) + + +# Middleware to log requests +@app.middleware("http") +async def log_requests(request: Request, call_next): + logger.info(f"Incoming request: {request.method} {request.url}") + response = await call_next(request) + logger.info(f"Response status: {response.status_code}") + return response + + app.include_router(portfolio_router.router, prefix="/v1") app.include_router(plan_router.router, prefix="/v1")