otel-logs-v0_9 schema, so this guide creates a custom index whose fields match syslog’s own: facility, severity, hostname, appname, procid, message. Vector’s syslog source emits those under the same names, so the transform below stays short.
If your application speaks OpenTelemetry, use the OTLP endpoint instead. This
page is for software that speaks syslog and nothing else.
Prerequisites
- A running Rootprint instance and the host it serves on. You’ll substitute it for
<your-rootprint>. - A Linux host running
rsyslog(the default on Debian, Ubuntu, RHEL and derivatives). If you runjournaldonly, see If you only run journald below. - A host to run Vector on. It can be the same machine that produces the logs, or a central relay that many machines forward to.
Setup
1
Create the syslog index
In Settings → Indexes → Create index, set the index ID to
syslog, mode to dynamic, and the timestamp field to ts. Add these fields:Under the optional settings, add
appname, facility and severity as tag fields. They hold few distinct values, so tagging lets the engine skip splits before scanning.Use dynamic mode so you don’t have to declare every field up front. RFC5424 structured data lands in a field named after its SD-ID, and anything else your senders attach stays searchable.2
Map the display roles
On the new index’s Configuration tab, set the field-role mappings so Search knows how to render a record:
- Log level →
severity - Message →
message
severity_text, body.message), so records look blank until you change them.3
Create an ingest key
In Settings → API keys, click Create ingest key, name it, and pick the
syslog index. Copy the rp_… token. You’ll paste it into the Vector config next. See API keys.4
Configure Vector
Install Vector from the official installation page, then save this at
/etc/vector/vector.yaml. Replace <your-rootprint> and <your-ingest-token>.Then restart it:framing.method: newline_delimited makes the http sink emit NDJSON, one object per line, rather than a JSON array.Port 5514 rather than 514: Vector runs as the unprivileged vector user and cannot bind a port below 1024. If a sender has 514 hard-coded, grant CAP_NET_BIND_SERVICE with a systemd override instead of running Vector as root.Vector also attaches source_ip, the address the record arrived from. It isn’t in the schema, but dynamic mode keeps it searchable, which helps on a central relay when you need to tell senders apart.5
Point rsyslog at Vector
Save this as
/etc/rsyslog.d/90-rootprint.conf, replacing <vector-host> with the machine running Vector (127.0.0.1 if it’s the same one):RSYSLOG_SyslogProtocol23Format is rsyslog’s built-in RFC5424 template. Without it rsyslog sends the older RFC3164 format, which carries no structured data and a lower-resolution timestamp.*.* forwards everything. To send less, narrow the selector: auth,authpriv.* for authentication records, or local7.* if you route application logs to a local facility.6
Verify in Rootprint
Send a test record:Open Search, pick
syslog from the index selector, and query hello from rsyslog. Allow a few seconds for Quickwit to commit. A 200 from the ingest endpoint means Rootprint queued the documents, not that you can search them yet.If you only run journald
Modern distributions runsystemd-journald, sometimes without rsyslog. Rather than reading the journal, have journald hand its records to syslog. In /etc/systemd/journald.conf:
rsyslog if it isn’t present. The configuration above applies unchanged.
Troubleshooting
- Nothing arrives: check that rsyslog can reach Vector.
ss -tnp | grep 5514on the rsyslog host should show an established connection. On a central relay, suspect a firewall between the two. 403from the ingest endpoint: the token is wrong, revoked, or scoped to another index. If your config uses${VAR}, check Vector’s version: 0.57 turned environment variable interpolation off by default, so Vector sends the variable name verbatim as the bearer token. The403gives no hint that the config is at fault. SetVECTOR_DANGEROUSLY_ALLOW_ENV_VAR_INTERPOLATION=truein Vector’s environment.- Records arrive but
tsis wrong or missing: the sender emitted RFC3164 rather than RFC5424. Confirm thetemplate="RSYSLOG_SyslogProtocol23Format"line is present. - Every record shows an
UNKNOWNlog level: the lines carry no<13>priority prefix, so Vector never parsedfacilityorseverity. - The program name appears in
hostname, andappnameholds the real hostname: an application is writing its own syslog frames to/dev/logwith a HOSTNAME field, butimuxsockexpects the localsyslog(3)format, which has none, so every field shifts by one. nginx does this. Point the application at127.0.0.1:514over UDP and loadimudpin rsyslog, so the network parser handles it. That parser does expect a hostname.
Related
- Send logs over HTTP: the endpoint this guide posts to
- Create a custom index: the full field-editor reference
- Manage indexes: field-role mapping
- Send logs with Vector: Vector install,
systemdand Docker setup - Search query syntax: querying the fields above

