From system-design-skills
Designs distributed logging pipelines (collect → buffer → ship → index → store → retain) for aggregating logs across many services. Covers ELK/EFK stacks, structured logging, correlation IDs, sampling, and cold-storage tiering.
How this skill is triggered — by the user, by Claude, or both
Slash command
/system-design-skills:distributed-loggingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Move logs from thousands of processes into one searchable place, fast enough to
Move logs from thousands of processes into one searchable place, fast enough to debug a live incident and cheap enough to keep for months. Getting it wrong is a classic "ignore failure" miss: the logging pipeline is itself a distributed system that buckles under the exact traffic spike you most need it during, and a naive design either drops the evidence or takes down the app it instruments.
More than one process emits logs and someone needs to search them together; an
incident requires correlating a request across services; log volume has outgrown
grep on a box; or compliance demands retention. The pipeline buys central search,
cross-service correlation, and a durable record decoupled from any single host.
A single service on one host where journald + log rotation is enough — a full
pipeline is pure operational overhead (YAGNI). Numeric time-series questions ("what
is p99 latency", "is error rate up") belong to metrics, not log scans — that is
observability's job; logs answer "what exactly happened to this request". Don't
ship every debug line at full volume before a number shows the volume justifies the
cost; sample first.
back-of-the-envelope). This sizes every stage.Collection (agent on the host)
Transport / buffer (the shock absorber)
messaging-streaming, e.g. Kafka): producers write to a
partitioned bus; indexers consume at their own pace. Use at high volume or when
multiple sinks (search, archive, analytics) read the same stream.Index / store (the search backend)
Retention / tiering
blob-store): keep days of searchable data
hot, roll older data to compressed objects. Use whenever retention exceeds the
hot window economically (almost always).| Option | What it solves | What it worsens | Change it when |
|---|---|---|---|
| Node agent (Fluent Bit/Vector) | No app changes; central metadata + routing | One more daemon per host; parsing CPU; agent can lag | You need exact structure → emit structured events from the app |
| Direct-to-bus SDK | Clean structured events, no file parse | Couples app to transport; app blocks/loses logs if bus is down | Coupling/availability hurts → go back to agent + local buffer |
| Agent buffer → direct indexer | Fewest moving parts | Indexer backpressure hits producers; no replay; one sink | Volume spikes or you need >1 sink → add a log bus |
| Durable log bus (Kafka) | Absorbs spikes, decouples, replay, fan-out | Extra system to run; ordering only per-partition; cost | Volume is low and single-sink → drop the bus |
| Full-text index (ES/OpenSearch) | Fast rich field search | RAM/disk hungry; mapping explosions; costly at scale | Cost dominates and queries are label-filtered → Loki |
| Label-indexed (Loki) | Cheap storage at high volume | Weak full-text; slow on high-cardinality scans | You truly need arbitrary field search → full-text index |
| Hot index + cold archive | Cheap long retention | Cold reads are slow/manual to rehydrate | Forensic reads on old data must be fast → widen hot window |
The pipeline's failure mode is that incidents generate log spikes — an outage emits floods of errors and stack traces exactly when the pipeline is busiest, so it must degrade without amplifying the outage.
messaging-streaming).resilience-failure), dynamic sampling, alerts on ingest bytes/sec.Monitor: ingest bytes/sec and lines/sec, end-to-end ship lag, bus consumer lag, agent buffer fullness + drop rate, index queue/rejection rate, query latency.
Do
Don't
sequencer).observability.Size the pipeline from volume: lines/sec × bytes/line gives ingest bytes/sec; a few
KB/line at tens of thousands of lines/sec is already 100s of MB/s and TBs/day. Hot
index storage ≈ daily bytes × hot-days × (1 + replica + overhead); cold archive ≈
daily bytes × retention-days, compressed ~5–10×. Apply a peak multiplier for incident
floods. Don't restate latency/QPS/storage rules of thumb here — pull them from
back-of-the-envelope.
A log line is a contract: a structured event, not a string. Minimum fields:
{ "ts": "2026-05-29T12:00:00.123Z", "level": "ERROR", "service": "checkout",
"host": "pod-7", "trace_id": "abc123", "span_id": "f9", "msg": "charge failed",
"user_id": "u42", "err": "timeout", "latency_ms": 812 }
ts is the event time (sort key at query); trace_id/span_id correlate across
services; level and service are bounded index labels; high-cardinality values
(user_id) stay as searchable body fields, not index keys. The bus partition key is
usually service or trace_id to keep a request's lines ordered together.
Default to the generic recipe above. If the user names a cloud, read
references/providers/<provider>.md for the managed-service mapping, quotas/limits,
and provider-specific trade-offs. If no file exists for that provider, the generic
recipe is the answer.
To visualize the pipeline (producers → agents → bus → indexer/search + archive sink)
or the overflow/degradation path, use the in-plugin architecture-diagram skill —
draw the durable bus as the buffer between producers and sinks, the cold-archive sink
with a blob-store color, and the drop-on-overflow path as a dashed arrow.
observability — owned-concept lives in the three-pillars view: metrics, traces, alerting, and SLO/SLIs are taught there; logs are one pillar, and what to alert on is its job, not this skill's.messaging-streaming — depends on it for the durable log bus: delivery guarantees, ordering, backpressure, and DLQ semantics are owned there; this skill just uses the bus as transport.blob-store — feeds into it for cold log archival: durability, tiering, and lifecycle of the compressed cold objects live there.sequencer — pairs with this when ordering across hosts matters; monotonic IDs and clock-skew handling are owned there.system-design — owned-concept lives in the orchestrator: the reasoning loop, the trade-off method, and the ten failure modes. Feeds into the wider design.references/deep-dive.md — buffering and backpressure mechanics, sampling strategies, structured-logging + correlation-ID propagation, index lifecycle/rollover, ordering, and cold tiering. Read when designing the pipeline in detail.references/providers/{generic,aws,azure,gcp}.md — service mappings, limits, and pitfalls per environment.npx claudepluginhub proyecto26/system-design-skillsELK Stack, structured logging, log query patterns, and centralized log management.
Sets up centralized log aggregation with Loki/Promtail or ELK stack, including log parsing, label extraction, retention policies, and metric correlation for cross-service troubleshooting.
Deploys ELK Stack, Grafana Loki, or Splunk for centralized log aggregation with shippers, parsing rules, retention policies, dashboards, alerting, and RBAC on Docker or Kubernetes.