---
title: "Logging"
url: "/docs/observe/logging/"
kind: "feature"
summary: "Configure Arion's application log: levels and per-module filters, stdout or rolling files, and timestamp timezone."
---

> Arion site index: [/llms.txt](/llms.txt)

# Logging

Configure Arion's application log: levels and per-module filters, stdout or rolling files, and timestamp timezone.

The application log is what the Arion process says about itself — startup, configuration loading, xDS updates, warnings and errors. Use it to diagnose the gateway; per-request traffic belongs in [access logs](@/docs/observe/access-logs.md), which are a separate system.

## Enable it

Logging is always on. By default Arion writes to stdout at `info` level during startup, then applies the level from your configuration. The top-level `logging` section controls it:

```yaml,name=arion.yaml,arion=fragment
logging:
  log_level: "info"
```

`log_level` accepts a level (`error`, `warn`, `info`, `debug`, `trace`) or a full filter expression with per-module targets, in the same syntax as the `RUST_LOG` environment variable — for example `info,arion_lib=debug` raises only the proxy library to debug.

## Variations

### Set the level from the environment

`RUST_LOG` always wins over the configuration file:

```bash
RUST_LOG=debug arion --config /etc/arion/arion.yaml
```

The precedence is: `RUST_LOG`, then `logging.log_level`, then errors only. Setting the environment variable is the quickest way to turn on debug output for one run without editing the file.

### Log to a file

Set `log_file` to switch output from stdout to a rolling file. `log_directory` chooses where it goes (default: the working directory). Files rotate hourly.

```yaml,name=arion.yaml,arion=fragment
logging:
  log_level: "info"
  log_directory: /var/log/arion
  log_file: arion.log
```

### Timestamps and timezone

Each line carries a microsecond-precision timestamp with a numeric offset, plus the thread name (`proxy_RT0`, `services`, ...), which tells you which runtime emitted it. Timestamps are UTC unless you set the top-level `timezone` section:

```yaml,name=arion.yaml,arion=fragment
timezone:
  local: "Europe/Rome"
```

Any IANA timezone name works and applies to the application log and to access-log `%START_TIME%` alike. Daylight-saving transitions are tracked automatically.

## Verify

Start Arion and check the first lines on stdout:

```bash
arion --config /etc/arion/arion.yaml
```

Expected output includes lines like:

```text
2026-09-28T10:15:04.512345+0000  INFO main arion_proxy::proxy: Launching Service runtime with 1 threads
2026-09-28T10:15:04.514820+0000  INFO main arion_proxy::proxy: Launching 1 Proxy runtime(s) with 4 thread(s) each
```

If you see nothing after startup, remember the post-startup default without `RUST_LOG` or `logging.log_level` is errors only.

## Limits

- Output goes to stdout or to one rolling file — there is no syslog or network log shipper; run under systemd or a container runtime and collect it there.
- File output rotates hourly; the schedule is not configurable (unlike access-log rotation).
- Writes are asynchronous and non-blocking; a hard kill can lose the last buffered lines.
- There is no built-in redaction. `debug` and `trace` are verbose and can include request and configuration details, so keep production at `info` or above and treat debug logs as sensitive.

For the full list of environment variables Arion reads, see the [environment variable reference](@/reference/configuration/environment-variables.md).
