ZenoLog is a lean, in-memory, OTel-native log buffer. Instant visibility into all your services' logs — no databases, no persistent storage, no complex infrastructure. Just a 17 MB binary.
You just want to see your logs. But the industry says you need a cluster for that.
ELK needs 3+ pods, 2 GB RAM minimum, and 50 GB disk before you see a single log line.
Cloud logging charges per GB ingested. A medium cluster can cost more than the compute it monitors.
Loki needs object storage. Elasticsearch needs tuning. Fluentd needs configuration. All before day one.
ZenoLog: 1 pod, 15 MB RAM, 0 disk, 0 configuration.
ZenoLog replaces your entire log-viewing stack with a single binary. Native OpenTelemetry ingestion, in-memory ring buffers, full-text search, live tail, trace correlation — and both a Web UI and Terminal UI baked right in.
A full-featured Web UI and a keyboard-driven Terminal UI — both shipped inside the same 17 MB binary.
Every feature designed around how engineers actually debug.
Dual-protocol OpenTelemetry receivers. Point your existing OTel SDKs and they just work.
Automatic per-service isolation with dual-limit eviction. No noisy neighbor problems.
Per-source severity thresholds with probabilistic sampling. Control what you keep.
Instant search across all buffered logs with rich filtering. Find the needle in real time.
Real-time log streaming as events arrive. Watch your services in real time.
Click any trace ID to see every log from that transaction, across all services.
Full-featured SvelteKit dashboard compiled into the binary. No separate frontend to deploy.
Bubble Tea TUI for terminal-native workflows. SSH into a box and inspect logs instantly.
Real resource consumption compared to popular alternatives.
| Metric | ZenoLog | Loki | ELK |
|---|---|---|---|
| Container Image | 17 MB | 65 MB | 900 MB |
| Memory (idle) | 15 MB | 512 MB | 2 GB |
| Memory (10 services) | ~150 MB | ~1 GB | ~3 GB |
| Disk Required | None | 10 GB+ | 50 GB+ |
| Startup Time | <100 ms | ~5 s | ~30 s |
| Pods (Kubernetes) | 1 | 2–3 | 3–5 |
| External Dependencies | None | Object storage | JVM, storage |
Loki and ELK measurements based on minimal single-node deployments with default configuration.
Four stages from SDK to screen — all in one process.
OTel SDKs send logs via OTLP gRPC or HTTP. ZenoLog extracts service.name and routes to per-source buffers.
Per-source severity thresholds and probabilistic sampling decide what to keep. Drop noise before it enters the buffer.
Per-source circular ring buffers with dual-limit eviction (count + bytes). Old logs fall off automatically.
Search, live tail, and trace correlation via the REST API — rendered in the Web UI or Terminal UI.
Choose your path — all roads lead to logs.
Fastest path. Pull and run.
docker run -d \ -p 4317:4317 \ -p 4318:4318 \ -p 8080:8080 \ -p 8081:8081 \ jimmytoenners/zenolog:0.1.0
Single-pod deployment. Minimal footprint.
apiVersion: apps/v1
kind: Deployment
metadata:
name: zenolog
spec:
replicas: 1
selector:
matchLabels:
app: zenolog
template:
metadata:
labels:
app: zenolog
spec:
containers:
- name: zenolog
image: jimmytoenners/zenolog:0.1.0
ports:
- containerPort: 4317
- containerPort: 4318
- containerPort: 8080
- containerPort: 8081
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /readyz
port: 8080Single static binary. No runtime dependencies.
# Download curl -L -o zenolog \ https://get.zenolog.dev/latest chmod +x zenolog # Run ./zenolog # Open Web UI open http://localhost:8081 # Or use the TUI ./zenolog tui
Works with any language. Here's .NET as an example.
// .NET — Program.cs
builder.Logging.AddOpenTelemetry(otel =>
{
otel.SetResourceBuilder(ResourceBuilder.CreateDefault()
.AddService("my-service"));
otel.AddOtlpExporter(o =>
{
o.Endpoint = new Uri("http://localhost:4318/v1/logs");
o.Protocol = OtlpExportProtocol.HttpProtobuf;
});
});
// That's it. Logs appear in ZenoLog instantly.Sensible defaults. Override what you need.
| Variable | Default | Description |
|---|---|---|
| ZENOLOG_GRPC_ADDR | :4317 | OTLP gRPC receiver address |
| ZENOLOG_HTTP_ADDR | :4318 | OTLP HTTP receiver address |
| ZENOLOG_HEALTH_ADDR | :8080 | Health / readiness endpoint |
| ZENOLOG_API_ADDR | :8081 | API + Web UI address |
| ZENOLOG_MAX_SOURCES | 100 | Maximum number of distinct sources |
| ZENOLOG_RING_CAP | 10000 | Ring buffer record capacity per source |
| ZENOLOG_RING_MAX_BYTES | 10485760 | Ring buffer byte limit per source (10 MB) |
| ZENOLOG_SOURCE_RATE_LIMIT | 10 | Max new sources per minute (0 = unlimited) |
| ZENOLOG_CORS_ORIGINS | * | Comma-separated CORS allowed origins |
Free during early access. No credit card, no catch.
Full feature set. No limits.
Deploy ZenoLog in seconds. Point your OTel SDKs. Open the Web UI. That's the entire setup.
Get Started Now