Skip to main content

BufferLog — Buffer logs in memory, flush only on errors. Save 90%+ on APM costs.

Project description

bufferlog

Buffer logs in memory per-request. Flush only on errors. Save 90%+ on APM costs.

Table of Contents

Install

pip install bufferlog

With framework extras:

pip install bufferlog[flask]
pip install bufferlog[fastapi]
pip install bufferlog[django]

Usage

Flask

import logging
from flask import Flask
from bufferlog import BufferLog
from bufferlog.adapters import StdOutAdapter

app = Flask(__name__)
bl = BufferLog(adapters=[StdOutAdapter(pretty=True)])
bl.init_flask(app)

logger = logging.getLogger("myapp")
logger.addHandler(bl.logging_handler())
logger.setLevel(logging.DEBUG)

@app.route("/")
def index():
    logger.info("Processing request")   # Buffered (discarded on 200)
    logger.debug("SQL: SELECT * ...")    # Buffered (discarded on 200)
    return "OK"                          # 200 → logs discarded ($0)

@app.route("/fail")
def fail():
    logger.info("Starting transaction")
    logger.error("Connection lost")      # Triggers flush
    return "Error", 500                  # 500 → context sent to APM

FastAPI

import logging
from fastapi import FastAPI
from bufferlog import BufferLog
from bufferlog.adapters import StdOutAdapter
from bufferlog.middleware.fastapi_mw import BufferLogMiddleware

app = FastAPI()
bl = BufferLog(adapters=[StdOutAdapter()])
app.add_middleware(BufferLogMiddleware, **bl.asgi_kwargs())

logger = logging.getLogger("myapp")
logger.addHandler(bl.logging_handler())
logger.setLevel(logging.DEBUG)

@app.get("/")
async def index():
    logger.info("Handling request")
    return {"ok": True}

Django

# settings.py
MIDDLEWARE = [
    "bufferlog.middleware.django_mw.BufferLogDjangoMiddleware",
    # ... other middleware
]

# apps.py or wsgi.py
from bufferlog import BufferLog
from bufferlog.adapters import StdOutAdapter

bl = BufferLog(adapters=[StdOutAdapter()])
bl.init_django()

Configuration

from bufferlog import BufferLog, BufferLogConfig
from bufferlog.adapters import DatadogAdapter, SplunkAdapter, StdOutAdapter

bl = BufferLog(config=BufferLogConfig(
    # Max logs per request buffer. Oldest overwritten when full.
    buffer_capacity=100,

    # Log levels that trigger immediate flush.
    flush_on_levels=["error", "critical"],

    # HTTP status codes that trigger flush.
    flush_on_status_codes=[500, 501, 502, 503, 504],

    # Downstream targets for flushed logs.
    adapters=[
        DatadogAdapter(api_key="your-key"),
        SplunkAdapter(token="your-token", url="https://splunk.example.com"),
        StdOutAdapter(),
    ],

    # Enable/disable buffering.
    enabled=True,

    # If True, logs fall through to stderr on adapter failure.
    fail_open=True,

    # Scrub PII before logs enter the buffer.
    scrubber=lambda msg, meta: (msg.replace("password", "***"), meta),
))

Control Plane

Connect to the BufferLog Control Plane for remote policy management and usage tracking.

from bufferlog import BufferLog, ControlPlaneConfig

bl = BufferLog(
    control_plane=ControlPlaneConfig(
        url="https://control.bufferlog.io",
        api_key="bl_sk_your_key",
        poll_interval_s=60,
        telemetry_interval_s=60,
    )
)

When connected:

  • Poll for policy updates — buffer capacity, sampling rate, flush triggers, and bypass rules can all be changed remotely.
  • Push usage metrics — counters (never log data) are sent to power the ROI dashboard.

If the control plane is unreachable, the SDK continues with its last known configuration.

Metrics

metrics = bl.get_metrics()
# {
#   "buffers":  {"created": 1000, "discarded": 995, "flushed": 5, "active": 0},
#   "flash":    {"flush_count": 5, "events_flushed": 45, "adapter_errors": 0}
# }

Shutdown

Stop background threads and send a final telemetry report.

import atexit

atexit.register(bl.shutdown)

License

MIT

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

bufferlog-0.1.0.tar.gz (17.1 kB view details)

Uploaded Source

Built Distribution

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

bufferlog-0.1.0-py3-none-any.whl (20.4 kB view details)

Uploaded Python 3

File details

Details for the file bufferlog-0.1.0.tar.gz.

File metadata

  • Download URL: bufferlog-0.1.0.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for bufferlog-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7990658c5da3b202f8ad836dccbd5ad5e8898046ad067a20392c72d2c1ca3b13
MD5 8685103a741318d07301d830782433e9
BLAKE2b-256 cf1c5a76f9e7a3527407a54182a3a8c5f8fee31c9bce56f36af25e3b2b2bcd0d

See more details on using hashes here.

File details

Details for the file bufferlog-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: bufferlog-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for bufferlog-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6a55c783c9c38bd34f4ddb297739d9be314bc3bf7d5e5d0d6951d32d96375c0f
MD5 5129dc4e04d7fecc352fc7a3fac31f92
BLAKE2b-256 3b9b2060a5a947b13f458e457b763266b591df745f2d88c438c188f22168cc0c

See more details on using hashes here.

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