# 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. To view your app's logs, open the project's **Logs** tab in the dashboard, or run `ox logs --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. The log explorer over the last hour: one bar a minute, colored by level, and a maroon band where errors spiked. The query keeps the web process and hides health checks. The open line's **Lines around** brings back the 10 lines before and after it, from the same process. ## 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: Watch the logs: ```sh ox logs shop --follow ``` Without `--follow`, `ox logs` prints the last 100 lines and stops. Change the count with `-n`. The [CLI reference](https://console.t12.sorv.dev/docs/cli#deploys-and-runs) lists every `ox logs` flag. Secret values show as `[redacted]`. [Variables](https://console.t12.sorv.dev/docs/operate/variables#redacted) 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)`. The same filters from a terminal: ```sh 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:web` and `user_id:42` narrow the lines. `user_id` here is a field of a JSON or `key=value` line. - `"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. The same query from a terminal: ```sh 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 `. 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. A range from a terminal: ```sh 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`, `severity` and `text`. 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: Save logs to a file: ```sh ox logs shop --since 7d --severity error -o errors.log ``` It 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: One run's log: ```sh ox runs shop ox logs shop --run ``` 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](https://console.t12.sorv.dev/docs/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`](https://console.t12.sorv.dev/docs/cli#deploys-and-runs)) 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](https://console.t12.sorv.dev/docs/troubleshooting#crash-loop). - 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. Last updated 2026-10-15. The page as HTML: https://console.t12.sorv.dev/docs/operate/logs