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