Self-hostable structured logging

Logs.Fetched fast.

Ship structured JSON logs over plain HTTP. Search inside every payload, tail them live, and get an email the moment something catches fire.

$ curl -X POST /v1/logs -d @batch.json
202 Accepted {"accepted": 1000}
Log Dog logo: a dachshund in sunglasses lounging in a hot dog bun on a wooden log

How a log line travels

  1. 01 · Your appPOST /v1/logsOne entry or a batch of up to 1,000, with your app's API key.
  2. 02 · IngestValidated, acked 202Key checked in memory. No database on the hot path.
  3. 03 · Durable queueNATS JetStreamAbsorbs bursts so storage hiccups never reach your app.
  4. 04 · StorageClickHouseColumnar, compressed, written in big batches.
  5. 05 · YouSearch · Tail · AlertsQuery history, or watch it live straight off the queue.

Everything you need to find the bad log line. Nothing you don't.

Log Dog does logs, and only logs: ingest, search, live tail and alerts.

Ingest that never blocks

One HTTP endpoint. Logs are queued durably before they're written, so a slow database never slows your app. Under pressure you get a clean 503 with Retry-After, never silent drops.

202 Accepted · gzip bodies OK

Search inside the JSON

Every entry keeps its free-form attrs payload, and every key is queryable. Filter nested paths, compare numbers, negate anything, and share the URL.

customer.country:CA latency_ms:>400

Live tail

Watch logs land in your browser milliseconds after they're sent, streamed straight off the queue. Filter by app, level or text. Pause to read, jump to search at any line.

WebSocket · /v1/tail

Alerts by email

"20 or more errors in checkout within 5 minutes." Fires once, re-notifies while it stays broken, and tells you when it's resolved. No inbox floods.

ok → firing → resolved
  • Per-app API keysShown once, stored hashed, revoke or rotate anytime. The app comes from the key, never the payload.
  • 30-day retentionOld logs expire automatically. Per-app retention is on the way.
  • Saved, shareable searchesThe URL carries the whole query. Turn any search into an alert in one click.
  • Any HTTP clientIf it can POST JSON, it can ship logs. Official SDKs are coming next.

First log in under a minute

No SDK, no agent, no config file.

  1. 1

    Create an app

    Name it in the dashboard and copy your API key. It's shown exactly once.

    AppcheckoutAPI keyld_7Kq2mX9a••••••••••••••••
  2. 2

    Send a log

    Level, message, and any JSON you like in attrs.

    $ curl -X POST https://logs.example.com/v1/logs \
      -H "Authorization: Bearer $LOGDOG_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "level": "error",
        "message": "payment failed",
        "attrs": {
          "order_id": 8812,
          "err": "card_declined"
        }
      }'
  3. 3

    Watch it arrive

    Open Live tail and it's already there.

    20:15:03INFOcart updated
    20:15:03INFOcheckout started
    20:15:04ERRORpayment failed
    Streaming

A query language you already know

Type key:value pairs and words. Log Dog turns them into a fast, parameterized query, and points at the exact spot when something doesn't parse.

level:>=warnstatus:>=500customer.country:CA"card declined"-env:staging
Cheat sheet
level:errorExact level; level:>=warn for warn and up
err:card_declinedMatch a key in attrs
customer.id:c_19Nested paths with dots
latency_ms:>400Numeric compare: > >= < <=
trace_id:*Key exists
"free text"Words in the message
-env:stagingExclude anything with a leading dash

Your box. Your logs.

Log Dog is one Go binary plus three well-known services. Run everything in a single process for a side project, or split ingest, writer, API and alerter into their own containers when traffic grows.

  • logdogingest · writer · api · alerter
  • NATS JetStreamdurable queue
  • ClickHouselog storage
  • PostgreSQLusers, apps, alert rules
# clone both repos side by side
$ git clone https://github.com/vibr8soft/logdog_backend.git
$ git clone https://github.com/vibr8soft/logdog_frontend.git
$ cd logdog_backend

# write deploy/.env with generated passwords
$ deploy/bin/init-env.sh

# fill in the public URL, the SMTP account and LOGDOG_TAG (the git sha below) in deploy/.env, then build
$ make image VERSION=$(git rev-parse --short HEAD)
$ docker compose -f deploy/docker-compose.prod.yml build web

# creates the owner, dogfooding and the demo app, starts everything
$ BOOTSTRAP_OWNER_EMAIL=you@example.com deploy/bin/bootstrap.sh

Pricing

Self-hosted

[PRICE]

Run it on your own hardware with docker compose. Every feature on this page.

Read the self-host guide

Hosted

[PRICE] / month

We run the stack. You get an ingest URL and a dashboard. [PLAN LIMITS]

Start logging

Let the dog fetch your logs.

One endpoint today. Search, tail and alerts the moment data lands.

Start logging