Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

tailcove

Send Python logs to Tailcove with the standard logging module.
One handler, no dependencies, and it never slows down your code.

PyPI version Python versions PyPI downloads MIT license

Documentation · Report a bug · Get started free


Why use it

  • Plain logging. TailcoveHandler is a normal logging.Handler. Keep the loggers you already have.
  • Never blocks. Records are batched and sent from a background thread, so a request or a hot loop never waits on the network.
  • No dependencies. Delivery uses urllib from the standard library.
  • Safe. A failed delivery is caught and never raised into your code.
  • Structured exceptions. Log an exception and it arrives as data (class, message, location, trace), so identical errors group together.

Install

pip install tailcove

Requires Python 3.9 or newer.

Quick start

1. Get a token. Create a source in your Tailcove dashboard and copy its ingest token. It is shown only once, so save it somewhere safe (an environment variable is ideal).

2. Add the handler.

import logging
import os

from tailcove import TailcoveHandler

logger = logging.getLogger("myapp")
logger.addHandler(TailcoveHandler(token=os.environ["TAILCOVE_TOKEN"]))
logger.setLevel(logging.INFO)

logger.info("user signed up", extra={"user_id": 42})
logger.error("payment failed", extra={"order_id": 99, "reason": "card_declined"})

3. Open Tailcove. Your records appear in search and live tail within a couple of seconds.

Buffered records are flushed when your program exits normally, because Python's own logging.shutdown() closes every handler.

Options

Argument Default What it does
token — Your source's ingest token. Required.
endpoint https://ingest.tailcove.dev/api/v1/logs The ingest URL. Only change this if you self-host.
batch_size 50 Send once this many records are buffered.
batch_seconds 2.0 Send once this many seconds have passed since the first buffered record.
timeout 2.0 Seconds a delivery attempt may take before giving up.
trace_limit 10 Most stack frames kept when a logged exception is rendered.
level logging.NOTSET Lowest level this handler processes, on top of the logger's own level.

Records are sent once batch_size is reached or batch_seconds has passed, whichever comes first. They are never sent one HTTP request per log call. To send whatever is buffered right now, call handler.flush(). It blocks until the background thread confirms.

Structured context

Anything you pass in extra={...} is shipped as the line's context, with the same keys:

logger.info("order placed", extra={"order_id": 99, "total_cents": 4200})

Exceptions

Log with exc_info=True, or use logger.exception(...) inside an except block, and the exception is sent as structured data and not as a flattened string:

try:
    charge_card(order)
except CardDeclined:
    logger.error("payment failed", exc_info=True)
"exception": {
    "class": "billing.errors.CardDeclined",
    "message": "insufficient funds",
    "location": "/app/billing/charge.py:42",
    "trace": [
        "/app/billing/charge.py:42 in charge_card",
        "/app/orders/service.py:17 in place_order"
    ]
}

location is where the exception was raised, and trace is limited to trace_limit frames. It's the same shape the Laravel, Node and browser libraries use, so the same error groups into one issue whichever app reported it.

Frameworks

Django

Add the handler to LOGGING in settings.py:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "tailcove": {
            "class": "tailcove.TailcoveHandler",
            "token": env("TAILCOVE_TOKEN"),
        },
    },
    "root": {
        "handlers": ["console", "tailcove"],
        "level": "INFO",
    },
    "loggers": {
        "django.request": {
            "handlers": ["tailcove"],
            "level": "ERROR",
            "propagate": True,
        },
    },
}

Flask

Attach the handler to the app logger, or to the root logger if you want every logging.getLogger(__name__) in the app to ship too:

from flask import Flask
from tailcove import TailcoveHandler

app = Flask(__name__)
app.logger.addHandler(TailcoveHandler(token=app.config["TAILCOVE_TOKEN"]))
app.logger.setLevel("INFO")


@app.errorhandler(Exception)
def handle_exception(exc):
    app.logger.error("unhandled exception", exc_info=exc)
    raise

When delivery fails

Network errors and non-2xx responses never raise into your code. emit() follows the standard Handler convention and routes its own failures through handleError(). Errors on the background thread are caught and printed to stderr. Logging is best-effort by design.

Help and feedback

Other Tailcove libraries

Laravel · Node.js · Browser

License

MIT © Akcybex

Metadata

Release files for tailcove 0.1.0rc0

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

Source distribution (sdist)

Source distribution for tailcove 0.1.0rc0
File Size Uploaded Provenance
tailcove-0.1.0rc0.tar.gz 13.4 kB With provenance Details

Built distribution (wheel)

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

Total release size: 23.7 kB

Release files / tailcove-0.1.0rc0.tar.gz

Download URL tailcove-0.1.0rc0.tar.gz
Size 13.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c6b813c08e60ea5a3c95462c656bdd1b847475cc6bd824642b477fc4b5f1da30
BLAKE2b-256 checksum
How to use checksums
fc5cdc7b29ab3007d6f3ec39a351965a25a7bd0913cd3010a6c2dd428b7e3e4b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / tailcove-0.1.0rc0-py3-none-any.whl

Download URL tailcove-0.1.0rc0-py3-none-any.whl
Size 10.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1e73f51fabad9dbc798041c0927248458477b15a7d8b90dc246c084ffa14bd03
BLAKE2b-256 checksum
How to use checksums
b820035300c2d3ef1f6907e48633c31e39028ab51c43b142835dcca7616aed91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Security for tailcove 0.1.0rc0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for tailcove-0.1.0rc0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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