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:
| Level | Color | When to use |
|---|---|---|
| TRACE | Slate | Very fine-grained detail — entering/exiting functions |
| DEBUG | Blue | Diagnostic info useful during development |
| INFO | Emerald | Normal operation — requests handled, tasks completed |
| WARN | Amber | Something unexpected but recoverable |
| ERROR | Red | Something failed that needs attention |
| FATAL | Dark red | The 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.
# Search supports:
payment failed → contains both words
"card declined" → exact phrase
card OR timeout → either word
payment -refund → payment but NOT refundScreenshot 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
# 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"