ELK is the most common way a small team acquires a part-time job it never wanted.
Elasticsearch, Logstash, and Kibana have answered “how do I search my logs” for over a decade. The stack is powerful, well documented, and assumed by a mountain of tooling. It is also four services you now operate.
The minimum deployment:
Four moving parts, two JVMs, and five failure modes you have never met:
Heap sizing. Elasticsearch wants about half your RAM as heap, capped near 32GB for compressed pointers. Get it wrong and GC pauses stall ingest.
Shard management. Too many shards exhausts cluster state. Too few limits parallelism. Index lifecycle management helps, and it is one more thing to configure.
Mapping explosions. One high-cardinality field — a request ID will do it — blows up the index mapping and takes the cluster down. This is a common way ELK dies.
Disk watermarks. At 85% disk, Elasticsearch stops allocating shards. At 95% it marks indices read-only. Ingest stops, and often nothing tells you.
Version coupling. Elasticsearch, Logstash, Kibana, and Beats all want compatible versions. Every upgrade is a coordinated event.
None of that is unfair. Elasticsearch is a distributed search engine, and distributed search engines are complicated. The question is whether you need one to read your logs.
One binary. No JVM. No cluster. No separate UI service. No ingest pipeline.
./centrallogging
That gives you an HTTPS server with an auto-issued TLS certificate, a web UI, an ingest API, alerting, cron monitoring, and uptime checks. Logs land in SQLite files on local disk.
| ELK stack | Central Logging | |
|---|---|---|
| Services to run | 3–4 | 1 |
| Runtime | JVM + Node | Static binary |
| Storage | Elasticsearch indices | SQLite files |
| Memory baseline | Several GB minimum | Modest |
| Query language | Lucene / KQL / ES DSL | SQL and full-text search |
| Backups | Snapshot repository | Copy the files |
| Upgrades | Coordinated across components | -update |
| Cost | Free software, real ops time | $187 once |
| Cron monitoring | No | Yes |
| Uptime monitoring | No | Yes |
| Horizontal scale | Yes | No |
| Scale ceiling | Very high | ~10GB/day |
People notice this difference first. To aggregate in Elasticsearch you either filter with KQL and build a Kibana visualization, or you hand-write a JSON aggregation body.
Here is the same question in SQL:
SELECT
json_extract(msg, '$.request_uri') AS uri,
COUNT(*) AS hits,
ROUND(AVG(json_extract(msg, '$.request_time')), 3) AS avg_seconds
FROM logs
WHERE json_valid(msg)
GROUP BY uri
HAVING hits > 10
ORDER BY avg_seconds DESC
LIMIT 25;
No DSL. No visualization builder. Know SQL and you already know this tool. Full-text search handles the cases where SQL is ceremony.
Central Logging writes to SQLite databases with WAL enabled and batched writes. Four consequences:
cp. Or rsync, or a filesystem snapshot. No repository to register.json_extract. A high-cardinality field costs you disk, not cluster health.Filebeat → point its HTTP output at the ingest endpoint, or replace it with the CL Agent for system logs.
Logstash → most Logstash pipelines exist to parse unstructured text into fields. You have two options. Log JSON at the source and skip parsing (see the Nginx and Python guides). Or parse at ingest with a per-source JavaScript transform.
Grok patterns do not port. A large grok investment means real migration time. Spend it making the source emit JSON instead. That is less work than it sounds, and it deletes the parsing step for good.
rsyslog forwarding → see the rsyslog guide for omhttp with disk-backed queueing.
Run both stacks in parallel until you trust the new one.
Weigh that fifth point heavily. Already running Elasticsearch for something else? Then logs cost you almost nothing extra, and this page does not apply to you.
Stay with ELK if you log more than 10GB/day. Or if you already run Elasticsearch for something else. Or if you need Kibana dashboards, clustering, or RBAC. Or if you have years of grok and Beats config.
Switch if you deployed ELK only to read logs. Or if the cluster has demanded more attention than your application. Or if you are a small team with no platform engineer. Or if the memory footprint dwarfs the problem.
The free download is the full product. No credit card, no time limit.
Run it beside your cluster. Tee a real log stream into it. See what you miss.
14-day refund if you buy and it does not fit. See Deploy to get started.
💌 Get notified on new features and updates