Logs and Issues
Start with the Log viewer for quick queries, move to the Issues panel for job-level context, and tap into the live Messages stream when you need second-by-second insight. This page walks through those surfaces in order, then explains how the runtime feeds them.
Log viewer
Open Logs from the Operate sidebar (or visit /logs). The page is designed for fast iteration:
- Quick counters – the toolbar shows the total rows returned plus Info/Warning/Error badges so you can see the mix immediately. The All / Warning / Error buttons toggle the
log_levelfilter without retyping anything. - Time range – start and end pickers default to the last seven days. Adjust them to widen the window; each change reloads the table and resets the page size to 100 so you never accidentally request thousands of rows.
- Worker and job facets – dropdowns are populated from the REST API (
GET /api/workers/logs/workersand/jobs). Filters persist in the URL, which makes sharing views easy (/logs?worker=<id>&job=<name>). Deep links from Workers or Jobs append the same parameters automatically. - Record controls – pick 100, 200, or 500 rows per fetch. Refresh reruns the query with current filters, while Clear removes all filters and restores the default time range.
- Table detail – timestamps render in your local timezone, levels show DaisyUI badges, and long messages get truncated with tooltips. If the table says No logs, double-check advanced filters or clear everything with one click.
The viewer is backed by GET /api/workers/logs, so anything you can do in the UI can also be scripted:
curl -s "http://<server>:3000/api/workers/logs?log_level=Warning&num_records=200" | jq '.[].msg'Issues panel
- The Issues badge in the header counts unresolved problems through the Svelte
problemsStore. On load it fetches the latest 50 warning and error records so the badge reflects reality immediately. - A WebSocket subscription (
subscribeToErrorsAndWarnings) streams new events as the runtime emits them. The store deduplicates by timestamp, job, worker, and severity so repeated messages do not flood the list. - Dismissals persist in browser storage (up to 500 signatures) so reviewed warnings stay hidden across page reloads.
- Each issue card links outward: job and worker badges jump to the relevant pages, and View Logs pivots into the Log viewer with filters pre-filled.
Messages stream
The same events power the live Messages view under Operate -> Messages. You can subscribe to Job Status, Worker Status, Job Messages, Errors & Warnings, or enable the debug firehose. Use it to:
- Watch job deployments and shutdowns in real time.
- Track worker heartbeats alongside lag or backoff messages.
- Capture structured job logs without tailing server files.
- Pause, filter, or export the buffer as JSON for audits.
Messages remembers channel selections in your browser, so the feed comes back exactly how you left it.
How the runtime feeds these surfaces
- Runtime captures the issue – when an action hits a problem it records a structured warning or error on the event and keeps the event flowing. Job
runtime_optionssuch asdisable_warnings, plus per-run flags likeinline_warnings, control whether the warning is emitted or shown inline. - Messages stream distributes it – the runtime publishes structured log messages onto the Messages stream. Worker shutdowns, job retries, and warnings all travel through the same channel you can monitor in the UI.
- Server keeps a history – the platform stores every message and exposes it through
/api/workers/logs(plus the worker/job facet endpoints) so you can query historical data and drive dashboards or scripts. - UI surfaces the data – Logs provides search and filtering, Issues summarises outstanding problems per job, and Messages lets you observe the feed live.
Runtime emission rules
- Pass-through with warnings – actions do not drop events on configuration errors; they attach warnings instead. This contract is documented and tested in
docs/runtime/runtime-test-plan.md. - Visibility toggles –
disable_warningssuppresses warning generation for a job, whileinline_warningscontrols whether transient runs (Run & Trace) show warnings in the response. - Structured context – emitters include the step name, counts, and relevant arguments. Files input also records which file and checkpoint failed (
docs/runtime/files-recovery.md).
Troubleshooting the pipeline
- No warnings recorded – ensure the job metadata does not set
disable_warnings=true. Use Run & Trace withinline_warnings=trueto confirm the warning is produced locally. - Warnings missing from the UI but present in logs –
- Check Operate -> Messages to confirm new events are flowing.
- Query
/api/workers/logsdirectly. If results appear, inspect the browser console for WebSocket errors. - Verify the browser allows local storage; dismiss persistence relies on it.
- High volume of messages – narrow by worker or job, increase page size as needed, and export with
curlfor deeper analysis. Messages health cards highlight when the stream stays above recommended thresholds (docs/aggregator/performance-tasks.md).
Related reading
- Messages – full guide to the live stream.
- Monitoring – dashboards and API checks that complement Logs & Issues.
- Troubleshooting reference – retention settings and log collection tips.
docs/runtime/runtime-test-plan.md– engineering detail behind the pass-through-with-warnings contract.