View app and deploy logs: live, search, download
View your app's logs live in the dashboard or with ox logs: filter by severity and process, search with a regex, pick a time range, and download them.
Last updated 2026-10-15
On this page
To view your app's logs, open the project's Logs tab in the dashboard, or run ox logs <project> --follow in a terminal. The logs are the lines your app, its workers and its cron jobs print. You can watch them live, filter and search them, look at a time range, and download them. Each deploy also has a log of its own, with the build output.
The Logs tab has two views. It opens the log explorer, which has a chart and a query bar. Classic view, in the explorer's More menu (⋮, at the end of its toolbar), switches to a plain pane of lines, and Explorer switches back. Both views keep the process you picked. With Live off, the time range comes along too. With Live on, the other view opens live.
Read live logs and follow new lines
In the dashboard, open the project and pick the Logs tab. The explorer opens with Live on, so new lines appear on top as they arrive.
The classic view shows the last 300 lines and checks for new ones every 5 seconds. Keep Follow ticked to stay on the newest line. When you scroll up, Follow turns off, so the page stops jumping while you read.
From a terminal:
ox logs shop --followWithout --follow, ox logs prints the last 100 lines and stops. Change the count with -n. The CLI reference lists every ox logs flag.
Secret values show as [redacted]. Variables lists what ox hides.
Filter by severity and search the logs
The classic view has a bar of filters above the lines. The explorer uses a query bar instead, described in the next section.
- All, Errors and Warnings show lines of that severity and worse.
- All processes is a menu: pick one process, such as the app or one worker.
- Search the logs finds lines with that text. Case does not matter.
- .* turns the search into a regular expression. Case matters, unless it starts with
(?i).
ox logs shop --severity error
ox logs shop --process web --grep "timeout"
ox logs shop --regex "status=5[0-9][0-9]"--severity takes error, warn, info, debug or unknown. unknown is a line that says nothing of its level. You can use --grep or --regex, but not both.
Explore lots of lines with a chart
The explorer's chart shows how many lines of each level arrived over the last 15 minutes, hour, day or week. A maroon band marks a burst of errors. Click a bar, or drag across bars, to look at just that time. The table under the chart holds up to 100,000 lines, newest first, and Live puts new ones on top.
Type a query in the bar. Press / to jump to the bar from anywhere on the page. Every word must match:
level:error,unit:webanduser_id:42narrow the lines.user_idhere is a field of a JSON orkey=valueline."two words"matches a phrase.- A
-in front of any of these hides what it matches, as in-healthcheck.
Click a line to see its fields. From there, Copy for AI copies the line with the 10 lines around it, plus the project, process and release it came from. You can paste that into a chat with an AI assistant.
ox logs shop --since 1h --query 'level:error -healthcheck'See the lines around a match
A filter hides the lines next to an error, and those often say why it happened. When a filter or search is on, a matching line shows two buttons. ↑10 brings back the 10 lines just above it, and ↓10 the 10 lines just below. In the live view you can also click the line, or press Enter on it, to open both sides. Press a button again to go 10 lines further.
The lines that come back have every severity and ignore the search, from the same process the page shows. They look dimmer than the matching lines, and a line already on the screen is not shown twice. If no buttons show on a search, your server's agent is too old to send a line's place. Update it with ox servers update <server>.
The terminal has no such button. Use a time range with no filter to see what came before a line.
Look at a time range, up to 30 days back
The explorer has buttons for the last 15 minutes, hour, day and week. In the classic view, the Time range menu has Live, Last 15 min, Last hour, Last 24 hours, Last 7 days and Custom. Custom asks for a start and an end time in UTC. Load earlier goes further back. A range or a search turns Follow off. Tick it again to go back to live.
ox logs shop --since 2h
ox logs shop --since 2026-10-07T09:00 --until 2026-10-07T10:00--since and --until take a length like 2h or 7d, a time like 2026-10-07T09:00 (UTC), or an RFC 3339 time.
Your server keeps logs for up to 30 days. It keeps less when the logs fill their share of the disk: 500 MB for the whole server, or 1 GB on a disk of 40 GB or more. The bottom of the page says how far back this server goes.
Download logs as .log or ndjson
The explorer's More menu (⋮) has Download as text (.log) and Download as JSON (.ndjson). In the classic view, the bottom of the Logs tab has two download links. It says Download the last 24 hours while live, or Download when a range or search is on:
- .log: one line per log line, as time, process and text.
- .ndjson: one JSON object per line, with
time,process,unit,severityandtext.
A download uses your range and filters, and stops at 100 MB. From a terminal, -o saves the same thing to a new file, and --json makes it ndjson:
ox logs shop --since 7d --severity error -o errors.logIt prints Saved errors.log with the size. It never writes over a file that already exists.
Read the log of one deploy or build
A deploy, rollback, backup or restore has a log of its own. Open it from Runs on the Deployments tab, or list the runs and print one:
ox runs shop
ox logs shop --run <id>For a run that is still going, add --follow to print its new lines until it ends. The command then exits with the run's result.
When a run fails, its page opens with a card that says what failed in plain words, why, and how to fix it. The card shows the last lines of output and a Deploy again button. The full log follows, ending with the step, the cause and the fix. Troubleshooting explains each message.
The card also says the site is still up when the project was live and the failure left its running version in place: a failed build, or a new version that did not start and was switched back. After a failed switch, or on a stopped project, it says nothing about the site.
A one-off command (ox exec) is a run too. The list shows it as Command, with what was typed and its exit code. Its output is your app's own data, so only the console or a full access token shows it. A read only or deploy only token gets the run without its output.
If the logs show nothing
- No lines at all: the app may not be running. Check
ox status shop, then the last run's log. If it keeps restarting, see The app keeps crashing. - A download ends with
ox: the download stopped at the 100 MB limit; narrow the time range or the filters for the rest: pick a shorter range or add a filter. - Older lines are gone: they are past the 30 days or the size limit above, and ox cannot get them back.