Log Management

Search the logs, keep the trace

Logs arrive structured, with their resource attributes and their trace id intact. That means a search result is not a dead end — every line opens the request that wrote it.

The surface

Severity, service and attribute, in one filter rail

Facets are computed from the rows actually in range, so the counts beside each severity are the counts you are about to see, not a stale summary.

Structured log search with severity facets and attribute filters down the left rail
/logs severity >= WARN
signal
logs
transport
OTLP · no agent
severity
TRACE · DEBUG · INFO · WARN · ERROR · FATAL
filters
body · resource.* · log.*
joins.on
trace_id · span_id
buckets
5 min

In motion

The stream, running

Lines arrive as they are written, each one tagged with its service and severity. This is the tail view, and it is the same rows the search returns.

logs · stream LIVE
12:04:18 INFO edge GET /api/orders/8421 200 412ms
12:04:18 INFO orders-api load_order order_id=8421 366ms
12:04:18 DEBUG auth verify_jwt iss=auth.maple.dev 38ms
12:04:18 INFO postgres SELECT line_items rows=12 158ms
12:04:18 INFO shipping rate_quote carrier=ups 96ms
12:04:18 WARN fedex-api POST /rates retried (1/3) 72ms
12:04:18 INFO redis SET order:8421:rate ttl=3600 14ms
12:04:19 INFO edge GET /api/cart 200 94ms
12:04:19 INFO cart-svc load_cart user=u_4109 58ms
12:04:19 DEBUG feature-flag evaluate fast_checkout=false
12:04:19 ERROR payments stripe.charge declined card=v•••4242 204ms
12:04:19 WARN payments fallback to authorize_only flow
12:04:19 INFO kafka produce orders.canceled offset=98041
12:04:20 INFO edge POST /webhooks/stripe 200 26ms
12:04:20 INFO events dispatch payment.failed → ops
12:04:20 DEBUG scheduler reschedule retry_at=12:04:25
12:04:20 INFO edge GET /api/inventory 200 41ms
12:04:20 INFO inventory lookup sku=SKU-9081 region=iad 23ms
12:04:20 WARN inventory stock low sku=SKU-9081 qty=3
12:04:21 INFO search query "red shoes" hits=412 82ms
12:04:21 INFO edge GET /api/recos 200 67ms
12:04:21 DEBUG recos model=v3.2 cohort=A2
12:04:21 INFO edge POST /api/feedback 201 18ms
12:04:21 INFO analytics track event=checkout_started
12:04:18 INFO edge GET /api/orders/8421 200 412ms
12:04:18 INFO orders-api load_order order_id=8421 366ms
12:04:18 DEBUG auth verify_jwt iss=auth.maple.dev 38ms
12:04:18 INFO postgres SELECT line_items rows=12 158ms
12:04:18 INFO shipping rate_quote carrier=ups 96ms
12:04:18 WARN fedex-api POST /rates retried (1/3) 72ms
12:04:18 INFO redis SET order:8421:rate ttl=3600 14ms
12:04:19 INFO edge GET /api/cart 200 94ms
12:04:19 INFO cart-svc load_cart user=u_4109 58ms
12:04:19 DEBUG feature-flag evaluate fast_checkout=false
12:04:19 ERROR payments stripe.charge declined card=v•••4242 204ms
12:04:19 WARN payments fallback to authorize_only flow
12:04:19 INFO kafka produce orders.canceled offset=98041
12:04:20 INFO edge POST /webhooks/stripe 200 26ms
12:04:20 INFO events dispatch payment.failed → ops
12:04:20 DEBUG scheduler reschedule retry_at=12:04:25
12:04:20 INFO edge GET /api/inventory 200 41ms
12:04:20 INFO inventory lookup sku=SKU-9081 region=iad 23ms
12:04:20 WARN inventory stock low sku=SKU-9081 qty=3
12:04:21 INFO search query "red shoes" hits=412 82ms
12:04:21 INFO edge GET /api/recos 200 67ms
12:04:21 DEBUG recos model=v3.2 cohort=A2
12:04:21 INFO edge POST /api/feedback 201 18ms
12:04:21 INFO analytics track event=checkout_started
14.2k events / minute retention 30d · structured

What it does

What you can ask of a log line

/logs?q=
Search the body and the attributes
Resource and log attributes are columns, not a blob. Filter on service.name, deployment.environment or your own keys the same way you filter on the message text.
severity
Severity as meaning
The six OTel severity levels keep their own colour and their own facet. WARN and ERROR are one click apart, and neither is buried in a text match.
trace_id
Open the trace behind the line
Any line carrying a trace id opens its request, positioned at the span that was running when the line was written.
volume histogram
Volume before detail
The histogram above the results is stacked by severity, so a burst of ERROR at 14:20 is visible before you have read a single line.
OTLP
Sent the way OTel defines it
Logs come in over OTLP alongside traces and metrics. No log-shipping agent, no second pipeline to keep alive, no separate retention to reason about.

Keep going

Surfaces that share this data

Point OTLP at Maple.

One endpoint, one key. Traces, logs, metrics and sessions land on the same trace id from the first request.