GuardAPI Logo
GuardAPI

Fix Insufficient Logging & Monitoring in FastAPI

Insufficient logging and monitoring is the 'silent killer' of modern APIs. In a default FastAPI setup, you're flying blind—attackers can brute-force endpoints, exfiltrate data, or trigger 500 errors without leaving a trace in your SIEM. To fix this, we must implement structured logging, request correlation, and audit trails for high-value actions.

The Vulnerable Pattern

from fastapi import FastAPI, HTTPException

app = FastAPI()

VULNERABLE: No logging configuration, no correlation IDs, no auditing

@app.post(‘/login’) def login(username: str, password: str): if username == ‘admin’ and password == ‘password123’: return {‘status’: ‘success’}

# Silent failure: No record of the attempt, IP, or username
raise HTTPException(status_code=401, detail='Invalid credentials')</code></pre>

The Secure Implementation

The secure implementation addresses three core failures: 1. Structured Logging: By using JSON format, logs are immediately ingestible by ELK/Splunk for automated alerting. 2. Correlation IDs: Every request is assigned a UUID via middleware, allowing you to trace an attacker's entire session across multiple log lines. 3. Security Auditing: Critical events (like failed logins) are explicitly logged with metadata (IP, username, severity), enabling real-time detection of brute-force and credential stuffing attacks.

import logging
import uuid
import time
from fastapi import FastAPI, Request, HTTPException
from pythonjsonlogger import jsonlogger

app = FastAPI()

Initialize Structured Logging (JSON)

logger = logging.getLogger(‘api_logger’) log_handler = logging.StreamHandler() formatter = jsonlogger.JsonFormatter(’%(asctime)s %(levelname)s %(name)s %(message)s %(request_id)s’) log_handler.setFormatter(formatter) logger.addHandler(log_handler) logger.setLevel(logging.INFO)

@app.middleware(‘http’) async def log_requests(request: Request, call_next): request_id = str(uuid.uuid4()) request.state.request_id = request_id start_time = time.time()

response = await call_next(request)

duration = time.time() - start_time
logger.info('request_completed', extra={
    'request_id': request_id,
    'method': request.method,
    'path': request.url.path,
    'status_code': response.status_code,
    'latency': duration,
    'client_ip': request.client.host
})
return response

@app.post(‘/login’) async def login(username: str, request: Request): # Audit high-value events request_id = request.state.request_id if username == ‘admin’: logger.info(‘auth_success’, extra={‘user’: username, ‘request_id’: request_id}) return {‘status’: ‘success’}

logger.warning('auth_failure', extra={'user': username, 'request_id': request_id, 'severity': 'high'})
raise HTTPException(status_code=401, detail='Unauthorized')</code></pre>
System Alert • ID: 4608
Target: FastAPI API
Potential Vulnerability

Your FastAPI API might be exposed to Insufficient Logging & Monitoring

74% of FastAPI apps fail this check. Hackers use automated scanners to find this specific flaw. Check your codebase before they do.

RUN FREE SECURITY DIAGNOSTIC
GuardLabs Engine: ONLINE

Free Tier • No Credit Card • Instant Report

Verified by Ghost Labs Security Team

This content is continuously validated by our automated security engine and reviewed by our research team. Ghost Labs analyzes over 500+ vulnerability patterns across 40+ frameworks to provide up-to-date remediation strategies.