Skip to main content
Console Logs page in light theme
The Console Logs page at /console-logs is a live log viewer for the apps you build here. Your app posts structured log records to a REST endpoint on the control plane, and this page stores, searches, annotates, and exports them — so output you saw on a device five builds ago is still there, still searchable, next to the build that produced it. It is one of three views over the same timeline. Console Logs shows console records only; Analytics Events shows product events only; the Unified View interleaves both.

What a console record contains

Every record your app sends carries seven fields. The server adds three more on arrival.
level and category are not enumerations. Whatever strings your app sends become the values you can filter on. The page colors well-known ones — error and fatal red, warn amber, debug and trace grey, info blue — and assigns a stable color to everything else.
Anything in attributes is flattened into dotted paths — {"cache": {"hit": true}} becomes the field cache.hit — and each path becomes searchable, filterable, and available as a table column.

Searching

The search box matches against a flattened text rendering of the whole record: every field name and every value, including nested attribute paths. Three modes are available from the dropdown beside the box. Case sensitive applies to whichever mode is active. Patterns are limited to 1024 characters, and searching is debounced, so the timeline updates shortly after you stop typing.
A case-sensitive Text search is the fastest option — it is the one mode the server can push down into the database before scanning.

Filtering

Quick filters

Five dropdowns sit under the search box — Level, Category, Device IP, Build ID, and Session ID. Each lists the distinct values actually present in the stored records, so an empty dropdown means nothing has arrived with that field yet. Selecting several values within one dropdown matches any of them; selections across dropdowns must all match.

Advanced filters

Filters opens a sheet for conditions that quick filters cannot express. Each condition targets one field — including flattened attribute paths — with an operator and a value. Set Match to All conditions or Any condition, and give each condition its own case sensitivity. The Filters button shows a badge with the number of active conditions. Right-clicking any cell or attribute row offers Filter by value, which adds the right condition for you — a quick filter if the field has one, otherwise an advanced condition.

Saved filters

Name a set of conditions and Save filter to reuse it. Saved filters are stored per view, so a Console Logs filter does not clutter the Analytics Events sheet. The filter marked active is reapplied the next time you open the page.

Columns

Columns opens the column manager. The starting set is Time, Level, Category, Message, Build ID, and Session ID; Device IP, Received, and Attributes are also available, along with every attribute path discovered in the stored records.

Choose and order

Add fields, remove them, and move them up or down. Up to 100 columns are allowed, and one must always remain.

Promote an attribute

Expand a record and click the + beside any attribute path to add it as a column without opening the manager. Hover a column header and click to drop it again.

Save a preset

Name the current layout and save it. Mark one preset as the default for this view, or Reset columns to return to the shipped set.
The 12h / 24h toggle changes time rendering for the table and for exports, and it is saved with the view.

Reading the timeline

Records are listed newest first, 200 at a time, with Load more at the bottom. The counter above the table reads matching of total.
  • Rows are grouped under a local-day header.
  • Clicking a row expands it: the full message, a metadata grid — time, received, device IP, build ID, session ID, level, category — and the attributes dictionary rendered as path and value pairs.
  • Newly arrived rows flash briefly, so you can see ingestion happening live.
  • Right-click a cell for Copy <column>: value, Copy value, and Filter by value. Right-click the attributes block for Copy JSON dictionary or Copy path: values.
  • The expanded row carries a Highlight swatch strip — 19 colors plus a clear button — that tints the row for everyone using the app, and a Delete button for that single record.

Separators

Separators are horizontal markers in the timeline. They are shared across all three views and come from two places. Because a build separator lands at the moment the build was created, everything above it is output from that build. Hovering a separator reveals a delete button.

Editing and clearing

Edit turns on selection checkboxes and a destructive toolbar.

Select

Check individual rows, a whole day via its header, everything above a separator via that separator’s checkbox, or Select all matching rows in the header — which selects the entire filtered result set, not just what is loaded.

Clear selected

Deletes exactly what is selected. With Select all active it deletes every record matching the current search and filters, minus anything you unchecked.

Clear all

Asks whether to Clear records or Clear with separators, then deletes every console record — filters are ignored.

Clear before latest separator

Deletes everything older than the most recent separator. Useful for keeping only the current build’s output.
Deletion is immediate and permanent — there is no undo and no archive. Clear all ignores whatever filters are on screen.

Exporting

Export writes the current view to a file. When rows are selected the dialog exports the selection; otherwise it exports everything matching the current search and filters.
  • Formats: CSV, Markdown, and PDF.
  • Pick up to 30 fields; the export starts from your current columns.
  • Your locale, time zone, and 12h/24h preference are applied to timestamps.
  • The file downloads as observability-<YYYY-MM-DD>.<ext>, and the export records the search and filters that produced it.

Collection and endpoints

The header button reading Console on or Console off is the ingestion switch. Turning it off does not reject requests — the endpoint keeps validating payloads and answers 202 Accepted without storing anything, so a device in the field never sees an error. The gear icon opens Observability settings, shared by all three views. Each row shows the detected value, the effective value, and copyable console and analytics endpoints for both origins. Overrides must be a plain HTTP(S) origin — no path, credentials, query, or fragment.
Build scripts receive these values. A pre-build script gets a telemetry object with selectedBaseUrl, consoleLogsUrl, analyticsEventsUrl, and both collection flags, so you can bake the right endpoint into the app for the destination being built. See Builds.

Sending console logs

The ? icon in the header opens Send console logs, which renders the ingestion contract against your own configured origins and offers Copy Markdown docs to paste into a client project. Send one record, or an atomic batch as { "items": [...] } with up to 500 records. The endpoint is unauthenticated, Content-Type must be application/json, and the request body is capped at 2 MiB.

Validation rules

All seven fields are required, and unknown fields are rejected. Server-owned fields — id, entryType, receivedAt, deviceIp, highlightColor, separatorKind, separatorName — may be present but are ignored.

Responses

Live updates

The page subscribes to telemetry changes and reconciles in place. New records appear as they are ingested, highlights and deletions from other browsers apply immediately, and settings changes made elsewhere refresh the toolbar. Returning to the tab triggers a reconcile, so you never look at a stale timeline.

Analytics Events

Product events with their default and additional parameters.

Unified View

Console logs and analytics events in one timeline.

Build details

The build a separator marks, with its own log stream.

GraphQL API

telemetryTimeline, clearTelemetry, and the rest of the telemetry graph.