Skip to content

FastAPI Integration

LoglyMiddleware adds request metadata to the logging context for each request.

Basic Setup

python
from fastapi import FastAPI
from logly.integrations.fastapi import LoglyMiddleware

app = FastAPI()
app.add_middleware(LoglyMiddleware)

@app.get("/")
async def root():
    logger.info("Root endpoint called")
    return {"message": "Hello World"}

What It Captures

The middleware automatically contextualizes these fields:

FieldDescriptionExample
request_idUnique request identifiera1b2c3d4-e5f6-7890-abcd-ef1234567890
methodHTTP methodGET
pathRequest path/api/users
clientClient IP:port192.168.1.1:54321
user_agentUser-Agent headerMozilla/5.0...

Request Logging

python
from fastapi import FastAPI
from logly import logger
from logly.integrations.fastapi import LoglyMiddleware

app = FastAPI()
app.add_middleware(LoglyMiddleware)

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    logger.info("Fetching user {}", user_id)
    # Output: INFO | Fetching user 123 | request_id=... method=GET path=/users/123
    return {"user_id": user_id}

@app.post("/users")
async def create_user():
    logger.info("Creating user")
    # Output includes request context
    return {"created": True}

With Custom Format

python
from fastapi import FastAPI
from logly import logger
from logly.integrations.fastapi import LoglyMiddleware

app = FastAPI()
app.add_middleware(LoglyMiddleware)

# Add console sink with request context in format
logger.add(
    "stderr",
    level="INFO",
    format="{time:HH:mm:ss} | {level:<8} | {extra[request_id]} | {extra[method]} {extra[path]} | {message}",
    colorize=True,
)

@app.get("/")
async def root():
    logger.info("Request received")
    return {"message": "Hello"}

Error Handling

python
from fastapi import FastAPI, HTTPException
from logly import logger
from logly.integrations.fastapi import LoglyMiddleware

app = FastAPI()
app.add_middleware(LoglyMiddleware)

@app.get("/items/{item_id}")
async def get_item(item_id: int):
    if item_id == 0:
        logger.error("Invalid item ID: {}", item_id)
        raise HTTPException(status_code=404, detail="Item not found")
    logger.info("Item {} fetched", item_id)
    return {"item_id": item_id}

With Stdlib Integration

python
import logging
from fastapi import FastAPI
from logly import logger
from logly.integrations.fastapi import LoglyMiddleware
from logly.integrations.stdlib import InterceptHandler

app = FastAPI()
app.add_middleware(LoglyMiddleware)

# Route uvicorn logging through Logly
logging.basicConfig(handlers=[InterceptHandler()], level=logging.INFO)

Released under the MIT License.