OperationsLogs

Logs

Watch logs streams your workload's standard output live, across every replica of a deploy or for a single pod, with search and structured-field filters.

Open the logs viewer#

  • For a deploy: Deployments⋮Watch logs. It shows lines from every pod (replica) of that deploy.
  • For one pod: InfrastructurePods⋮Watch logs. It's narrowed to that single pod.

The viewer opens as a drawer. It loads recent lines, then connects a live stream and keeps following new output. The header shows whether it's live, paused or reconnecting (Not connected. Retrying…).

What each line shows#

DevLyft shows whatever your container writes to stdout and stderr. For each line you get:

  • A timestamp, to the millisecond. Hover it for the full date and time.
  • The pod it came from, shortened to the part that tells replicas apart. Hover it for the full pod name.
  • A level accent (ERROR, WARN, INFO, DEBUG), when one can be detected.
  • The message.

Structured (JSON) logs#

If a line is a JSON object, DevLyft uses message, msg, event or log as the message, and reads the level from level, levelname, severity, lvl or loglevel. Expand a line to see all of its fields. For plain-text lines, the level is detected from words such as ERROR, WARN or INFO in the text.

A line DevLyft can parse
{"level":"error","msg":"payment provider timeout","order_id":"o_8812","latency_ms":30012}

Search and filter#

Search logs…
A substring filter. Only matching lines are shown and streamed.
Field matches
Filter on a structured field. Click a match chip to cycle its operator between =, !=, =~ (regex match) and !~ (regex does not match). Every match must hold for a line to be shown.
Pod
Switch between all pods and a single pod.

If nothing matches, the viewer says No lines match the current filter.

Controls#

  • Pause and Resume stop and restart following, so you can read without the view scrolling away.
  • Toggle line wrapping switches between wrapped lines and one line per entry.
  • Clear the view empties the drawer. Your logs aren't deleted.

The viewer keeps up to 5,000 lines in the browser, and the oldest drop off as new ones arrive.

Logs over the API#

Recent lines
GET /v1/deploys/{deploy_id}/logs?pod=&filter=&since=&limit=&match=level%3Derror

The response is { "entries": [{ "timestamp", "line", "pod" }], "cursor" }. For a live tail, open a WebSocket to /v1/deploys/{deploy_id}/logs/stream. Browsers can't set an Authorization header on a WebSocket, so pass the token as the subprotocol pair ["bearer", "<token>"]. See API reference.