Skip to main content

rudow

Python SDK for Rudow. Batches log entries and ships them to the ingest API.

Install

pip install rudow

Quick Start

from rudow import create_logger

logger = create_logger({
    "api_key": "your-api-key-here",
})

logger.info("Server started", {"port": 8000})
logger.error("Database connection failed", {"error": "ECONNREFUSED"})

Configuration

Options passed to create_logger():

  • api_key (required): Your project's API key
  • endpoint: Ingest endpoint URL (defaults to https://api.rudow.ai/v1/ingest)
  • batch_size: Flush when this many entries are buffered (default: 20)
  • flush_interval_ms: Flush at most this often in milliseconds (default: 2000)
  • source: Logical source label (default: "backend")
  • max_buffer_size: Max entries kept in memory (default: 10000)
  • max_retries: Send attempts per flush before re-queueing (default: 4)
  • retry_backoff_ms: Base delay for exponential backoff (default: 500)
  • gzip_threshold: Compress payloads larger than this (bytes, 0 to disable, default: 1024)
  • persist_path: File path for crash-durable buffering (optional)
  • flush_on_exit: Auto-flush on SIGTERM/SIGINT (default: True)
  • fallback_to_stderr: Print undelivered logs to stderr (default: True)
  • enable_metrics_heartbeat: Send periodic metrics (default: True)
  • metrics_heartbeat_ms: Metrics interval in milliseconds (default: 15000)

Log Levels

The logger supports these levels:

  • debug(message, attributes)
  • info(message, attributes)
  • warn(message, attributes)
  • error(message, attributes)
  • fatal(message, attributes)

The generic log(level, message, attributes) method is also available.

Structured Events

The SDK supports rich structured event types:

HTTP Requests

Record completed HTTP requests with timing and status:

from rudow import record_http_request, HttpRequestEvent

record_http_request(logger, HttpRequestEvent(
    method="GET",
    route="/api/users",
    status=200,
    duration_ms=125.5,
    extra={"user_id": "user123"}  # Optional context
))

Exceptions

Record exceptions with stack traces:

from rudow import record_exception, ExceptionEvent

try:
    do_something()
except Exception as e:
    record_exception(logger, ExceptionEvent(
        error=e,
        method="POST",
        route="/api/process",
        status=500,
        extra={"request_id": "req-123"}
    ))

Metrics

Periodically emit process metrics (uptime, memory):

from rudow import start_metrics_heartbeat

stop = start_metrics_heartbeat(logger, interval_ms=15000)

# Later, to stop:
stop.set()

Durability

  • Batching: Entries are buffered and sent every 2 seconds or when 20 entries accumulate
  • Retries: Failed sends are retried with exponential backoff
  • Persistence: With persist_path set, undelivered entries survive process restarts
  • Graceful shutdown: Automatic flush on exit; call logger.flush() to ensure delivery

Example with FastAPI

See examples/fastapi-app/ for a complete example application.

from fastapi import FastAPI
from rudow import create_logger, record_http_request, record_exception, HttpRequestEvent
import os
import time

app = FastAPI()
logger = create_logger({"api_key": os.environ.get("RUDOW_API_KEY", "test-key")})

@app.middleware("http")
async def log_requests(request, call_next):
    start = time.time()
    try:
        response = await call_next(request)
        duration_ms = (time.time() - start) * 1000
        
        # Record structured HTTP event
        record_http_request(logger, HttpRequestEvent(
            method=request.method,
            route=request.url.path,
            status=response.status_code,
            duration_ms=duration_ms
        ))
        return response
    except Exception as exc:
        duration_ms = (time.time() - start) * 1000
        record_exception(logger, ExceptionEvent(
            error=exc,
            method=request.method,
            route=request.url.path,
            duration_ms=duration_ms
        ))
        raise

@app.get("/api/users")
async def get_users():
    logger.info("Fetching users", {"endpoint": "/api/users"})
    return {"users": []}

@app.exception_handler(Exception)
async def exception_handler(request, exc):
    record_exception(logger, ExceptionEvent(
        "path": str(request.url),
        "error": str(exc),
    })
    return {"error": str(exc)}

Metadata

Release files for rudow 0.1.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rudow 0.1.11
File Size Uploaded
rudow-0.1.11.tar.gz 8.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rudow 0.1.11
File Interpreter ABI Platform
rudow-0.1.11-py3-none-any.whl Python 3 none any Details

Total release size: 16.0 kB

Release files / rudow-0.1.11.tar.gz

Download URL rudow-0.1.11.tar.gz
Size 8.0 kB
Tags Source
SHA-256 checksum
How to use checksums
9af3304cd9224bd05eff2b7590960050b71cee736d93da3bd0a51b9c39cff58a
BLAKE2b-256 checksum
How to use checksums
1a425346951aedbf69dc532fa6100b940b5f48e69c581aee5d63a932378c4123
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Release files / rudow-0.1.11-py3-none-any.whl

Download URL rudow-0.1.11-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a0d24e876983411ae2153daa11bb0f2361245a5655d63e42eb8728185bc2cc83
BLAKE2b-256 checksum
How to use checksums
e49fbf8c2fed4f6a2c181aaea55c80e176d97252d30d06629fd0e0c14c1c3ac9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Release history Release notifications | RSS feed

0.2.0

2 release files

This release

0.1.11 This release

2 release files

0.1.10

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page