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: Infrastructure→Pods→⋮→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.
{"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#
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.