Back to Guides

FastAPI Integration Guide

Learn how to integrate Sift Dev logging with your FastAPI applications.

1. Installation

Install the Sift Dev Logger SDK using pip:

pip install sift-dev-logger
pip install "sift-dev-logger[fastapi]"

2. Environment Setup

Create a .env file in your project root.

Loading...

# Your Sift Dev endpoint and api key
SIFT_DEV_ENDPOINT=http://<YOUR-ORG-ID>.app.trysift.dev:8000
SIFT_DEV_INGEST_KEY=<YOUR-API-KEY>

# Optional configuration (defaults shown below)
SIFT_DEV_SERVICE_NAME=fastapi-app
SIFT_DEV_SERVICE_INSTANCE_ID=instance-1
ENV=unspecified

3. Configuration (Optional)

💡 Configuration Options

  • Environment variables are automatically detected from your system environment if present
  • Manual configuration via code will override environment variables
  • Configure must be called before using fastapi_logger or getLogger
  • FastAPI-specific features:
  • Automatic request and response logging
  • Optional request/response body capture
  • Performance metrics for each route
  • Error tracking with full stack traces
  • Request context in all logs
  • Async support out of the box

Configuration options and defaults

1from fastapi import FastAPI
2from sift_dev_logger import SiftDevConfig, configure, fastapi_logger
3
4# Optional: Configure with defaults or environment variables
5configure(SiftDevConfig(
6    sift_dev_endpoint="Initialize here, or set SIFT_DEV_ENDPOINT env var",
7    sift_dev_ingest_key="Initialize here, or set SIFT_DEV_INGEST_KEY env var",
8    service_name="fastapi-app",
9    service_instance_id="instance-1",
10    env="unspecified",
11    batch_delay_millis=5000
12))
13
14app = FastAPI()
15
16# Initialize the logger with your FastAPI app
17# Uses previous configuration, or creates a new default config if none exists
18fastapi_logger(app)

4. Usage

FastAPI middleware and custom logging

1from fastapi import FastAPI, HTTPException
2from sift_dev_logger import getLogger, SiftDevConfig, fastapi_logger
3
4app = FastAPI()
5
6# Initialize with custom configuration
7fastapi_logger(
8    app,
9    config=SiftDevConfig(service_name="custom-fastapi-app"),  # Optional custom config
10    max_body_size=50_000,  # Maximum body size to log (bytes)
11    ignored_paths={"/health", "/metrics"},  # Paths to exclude from logging
12    capture_request_body=True,  # Log request bodies (default: True)
13    capture_response_body=False  # Log response bodies (default: False)
14)
15
16# Get a logger for custom logging
17logger = getLogger()
18
19@app.get('/users/{user_id}')
20async def get_user(user_id: str):
21    # Custom log with request context
22    logger.info("Processing user request", extra={
23        "user_id": user_id,
24        "action": "get_user"
25    })
26    
27    try:
28        user = {"id": user_id, "name": "John Doe"}
29        return user
30    except Exception as error:
31        logger.error("User lookup failed", exc_info=error)
32        raise HTTPException(status_code=404, detail="Not found")

Configuring Uvicorn's internal logging

Instead of using the middleware, you can capture Uvicorn's internal logs by adding our handler to the existing loggers:

1import logging
2from sift_dev_logger import SiftDevHandler, SiftDevConfig
3
4# Configure Uvicorn loggers with Sift Dev
5loggers = [
6    "uvicorn",           # Server logs
7    "uvicorn.access",    # Access logs
8    "uvicorn.error",     # Error logs
9    "fastapi"            # FastAPI logs
10]
11
12# Create handler with custom config
13handler = SiftDevHandler(config=SiftDevConfig(service_name="fastapi-internal"))
14
15# Add handler to all Uvicorn loggers
16for logger_name in loggers:
17    logger = logging.getLogger(logger_name)
18    logger.setLevel(logging.INFO)
19    logger.addHandler(handler)

Using dictConfig for Uvicorn setup

Alternatively, configure Uvicorn logging using Python's dictConfig:

1from sift_dev_logger import SiftDevHandler
2
3LOGGING_CONFIG = {
4    "version": 1,
5    "disable_existing_loggers": False,
6    "formatters": {
7        "default": {
8            "format": "%(asctime)s :: %(name)s - %(message)s"
9        }
10    },
11    "handlers": {
12        "default": {
13            "formatter": "default",
14            "class": "logging.StreamHandler",
15            "stream": "ext://sys.stdout",
16        },
17        "siftdev": {
18            "()": "sift_dev_logger.handlers.SiftDevHandler.from_dict",
19            "formatter": "default",
20            "level": "INFO",
21            "config": {
22                "service_name": "fastapi-internal",
23                "service_instance_id": "instance-1",
24            }
25        }
26    },
27    "loggers": {
28        "uvicorn": {
29            "handlers": ["default", "siftdev"],
30            "level": "INFO",
31            "propagate": False,
32        },
33        "uvicorn.access": {
34            "handlers": ["default", "siftdev"],
35            "level": "INFO",
36            "propagate": False,
37        },
38        "uvicorn.error": {
39            "handlers": ["default", "siftdev"],
40            "level": "INFO",
41            "propagate": False,
42        },
43        "fastapi": {
44            "handlers": ["default", "siftdev"],
45            "level": "INFO",
46            "propagate": False,
47        }
48    }
49}

5. Advanced Usage

Next Steps

Now that you've set up logging in your FastAPI application:

  • View your logs in the Logs Dashboard
  • Set up alerts and notifications
  • Configure custom log attributes for better filtering
  • Explore our other framework integrations