Skip to main content

fastapi structured logging middleware (accesslog, opentelemetry)

Project description

fastapi-structured-logging

fastapi-structured-logging is a lightweight Python module that provides structured logging utilities and a configurable FastAPI access logging middleware. It configures structlog for JSON or console output, enriches log events with OpenTelemetry trace and span identifiers, and exposes an AccessLogMiddleware that can record request method, path, query parameters, client IP, user agent, status codes, processing time and more.

The middleware supports filtering, trusted-proxy handling, custom fields and messages, and integrates cleanly with existing Python logging to produce consistent, machine-readable access logs for observability and tracing.

Usage

from fastapi import FastAPI

import fastapi_structured_logging

# Set output to text if stdout is a tty, structured json if not
fastapi_structured_logging.setup_logging()

logger = fastapi_structured_logging.get_logger()

app = FastAPI()

app.add_middleware(fastapi_structured_logging.AccessLogMiddleware)

Configuration Options

The library provides extensive configuration options to customize logging and access logging behavior.

setup_logging() Options

  • json_logs (Optional[bool]): Forces JSON output if True, console output if False. Defaults to JSON if stdout is not a tty (e.g., in containers or files). Example: setup_logging(json_logs=True) for always JSON logs.
  • log_level (str): Sets the logging level (e.g., "DEBUG", "INFO", "WARNING"). Defaults to "INFO". Example: setup_logging(log_level="DEBUG") to enable debug logging.

AccessLogMiddleware Options

The middleware can be configured via an AccessLogConfig object passed to the middleware constructor. Example:

from fastapi_structured_logging import AccessLogConfig

config = AccessLogConfig(
    log_level="info",
    include_user_agent=False,
    exclude_paths={"/health"},
    custom_fields={"app_version": "1.0.0"}
)
app.add_middleware(fastapi_structured_logging.AccessLogMiddleware, config=config)

Key options include:

  • enabled (bool): Enables or disables access logging. Default: True.
  • log_level (str): Log level for access logs ("debug", "info", etc.). Default: "info".
  • include_* flags: Control which fields are logged, such as include_method (request method), include_path (request path), include_query_params (query parameters), include_client_ip (client IP), include_user_agent (user agent string), include_forwarded_headers (proxy headers), include_status_code (response status), include_process_time (processing time in ms), include_content_length (response content length), include_referer (referer header). All default to True except include_referer (False).
  • exclude_* sets: Filter out logs for specific paths (exclude_paths), methods (exclude_methods), status codes (exclude_status_codes), or paths only if status is 200 or 404 (exclude_paths_if_ok_or_missing).
  • min_process_time / max_process_time (Optional[float]): Only log requests with processing time within these bounds (in seconds).
  • custom_message (str): Custom log message. Default: "Access".
  • custom_fields (Dict[str, Any]): Additional fields to include in every log entry. Example: {"app_version": "1.0.0"}.
  • logger_name (str): Name of the logger to use. Default: "access_log".
  • trusted_proxy (List[str]): List of CIDR ranges for trusted proxies to extract real client IP. Example: ["10.0.0.0/8", "192.168.0.0/16"].

Convenience functions

  • setup_logging() initialize structlog to use line logging if stdout is a tty or JSONL if not (file, container output etc...)

  • get_logger() return a structlog logger

  • json_serializer() for fast serialization in orjson

    @app.exception_handler(RequestValidationError)
    async def validation_exception_handler(request: Request, exc: RequestValidationError):
        exc_str = f"{exc}".replace("\n", " ").replace("   ", " ")
        logger.error("validation exception", validation_error=json_serializer(exc.errors()))
        content = {"status_code": 10422, "message": exc_str, "data": None}
        return JSONResponse(content=content, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY)
    

Setup dev env

uv venv
uv pip install -r requirements-dev.txt
pre-commit install

Test

. venv/bin/activate
uv pip install -e .[full]
pytest --cov-report html --cov-report term --cov-report xml:cov.xml

Build

echo x.y.z > VERSION
uv pip install -r requirements-release.txt
uv run python -m build -s -w

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_structured_logging-1.0.2.tar.gz (10.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_structured_logging-1.0.2-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_structured_logging-1.0.2.tar.gz.

File metadata

File hashes

Hashes for fastapi_structured_logging-1.0.2.tar.gz
Algorithm Hash digest
SHA256 b43ac6d9dca56a886c55e390847a22102de5d1c07868aa2a6255c7651d789c30
MD5 35ed5979a87e21fd0a55be767babb792
BLAKE2b-256 dc162ae2baba20e1ae62ccae1135d7dec7c84a85ee0366da28a13c579763a37c

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_structured_logging-1.0.2.tar.gz:

Publisher: release.yml on babs/fastapi-structured-logging

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastapi_structured_logging-1.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_structured_logging-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a942f645635dbc93c220885bbe1a9c1368dcbaa81cd0b5157baa74cda6795294
MD5 ee7ae2f43b6dddfd65a854ab274ed8c4
BLAKE2b-256 47a4dd92b30412cfe60a3641eb5122ca264f5f7f0059b6f83569e00978643c6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_structured_logging-1.0.2-py3-none-any.whl:

Publisher: release.yml on babs/fastapi-structured-logging

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page