Dashboard Get started

Logs

Lightarch stores logs as OpenTelemetry log records alongside your trace spans. The body column contains the actual log message text, making logs readable at a glance without needing to expand anything.

Screenshot needed

Logs page: table with columns Time, Level (colored badge), Message/Body (main column, truncated), Service, Env, Code, ms. Mix of INFO/ERROR/WARN rows. One ERROR row highlighted in light red background. Body examples: 'Payment failed: card_declined', 'GET /api/users 200', 'Cache miss for key=user:48af'.

Severity levels

Each log record has a severity level, shown as a colored badge:

LevelColorWhen to use
TRACESlateVery fine-grained detail — entering/exiting functions
DEBUGBlueDiagnostic info useful during development
INFOEmeraldNormal operation — requests handled, tasks completed
WARNAmberSomething unexpected but recoverable
ERRORRedSomething failed that needs attention
FATALDark redThe process cannot continue — imminent crash

Filtering logs

Screenshot needed

FilterBar on Logs page with all sections visible: Search input filled with 'payment failed', Service chips showing 'payment-service' chip with ✕, Severity showing ERROR and FATAL chips active (others dimmed), Status showing 5xx chip active. Time preset '1h' selected.

Full-text search

The Search field uses SQLite FTS5 — a full inverted index on the body column. It's fast even with hundreds of thousands of rows.

text
# Search supports:
payment failed          → contains both words
"card declined"         → exact phrase
card OR timeout         → either word
payment -refund         → payment but NOT refund

Screenshot needed

Logs page with Search='card declined' showing 4 results, all ERROR severity, all from payment-service. Body column shows 'Stripe error: card_declined - Your card was declined. Request ID: req_abc123'

Live tail

Click the Live button to open a WebSocket connection that streams new spans as they arrive — no polling, instant delivery via Durable Object broadcast.

Screenshot needed

Logs page in live mode: Live button shows pulsing green dot with 'Live' label. Log rows streaming in at the bottom. DevTools Network tab visible in background showing a single 'live' WebSocket connection (not repeated HTTP requests).

Log detail panel

Click any log row to open the detail panel on the right side.

Screenshot needed

Log detail panel (480px slide-out from right): 3 tabs at top — Overview (active), JSON, Context. Overview tab shows: Body='Stripe error: card_declined', Service=payment-service, Severity=ERROR, Timestamp=2026-05-19 14:32:11 UTC, Duration=342ms, Status=500, Trace ID=aabb1122..., Host=ip-10-0-1-42. Below that: Attributes section showing http.method=POST, http.route=/api/payment/charge, error.type=CardDeclinedError.

Context tab

The Context tab fetches 10 logs before and 10 logs after the selected log in chronological order — the same window of time in your system. Useful for understanding what else was happening when an error occurred.

Screenshot needed

Context tab: 10 grey rows above showing earlier logs, then the selected row highlighted in blue/cyan (pivot), then 10 grey rows below. Each row shows time, level badge, service, truncated body. A 'Load more' section at top and bottom.

CLI

bash
# Live tail a specific service
la logs tail --service payment-service

# Errors only
la logs tail --service api-gateway --errors-only

# Search cold storage
la logs search "card declined" --last 7d

# SQL query on hot index
la query "SELECT body, severity, service FROM recent_spans WHERE body LIKE '%timeout%' ORDER BY timestamp DESC LIMIT 20"