Syslog is the standard protocol that devices, operating systems, and applications use to send event messages to a log collector. NXLog Platform collects, parses, and forwards messages in both BSD (RFC 3164) and IETF (RFC 5424) formats with a single extension.
Most security telemetry still travels as syslog at some point in its life. Firewalls, switches, Linux hosts, hypervisors, and a long list of security products emit it, and every major SIEM ingests it.
The word "syslog" names several things at once, though: two message formats, a set of transports, and the daemons that implement them. That ambiguity causes real problems in production — messages arrive on unexpected ports, timestamps lack time zones, and parsers written for one format choke on the other.
This post sorts that out: which ports syslog uses (and which of those are official), what the severity levels mean in a SecOps pipeline, and how RFC 3164 and RFC 5424 differ, with NXLog Agent configurations you can copy.
What is syslog?
Syslog is a logging protocol that defines how systems format event messages and transmit them to a local log file or a remote collector. A syslog message carries a priority value encoding a facility (the type of source) and a severity (how urgent the event is), a timestamp, the originating hostname, and the message text. Two documents define the format: RFC 3164 describes the original BSD version, and RFC 5424 specifies the current IETF standard that obsoletes it.
The protocol began as the logging mechanism for the Sendmail mail server in the 1980s. It spread with BSD Unix until it became the default logging system for Unix-like platforms and network equipment — all without a written specification. The IETF documented the "observed behavior" of existing implementations in 2001 with RFC 3164, then published a proper standard in 2009 with RFC 5424.
RFC 5424 describes three roles in a syslog deployment: an originator generates messages, a relay forwards them, and a collector receives and stores them. One process can hold several roles at once. An NXLog Agent instance, for example, often acts as a collector for nearby network devices and a relay toward a SIEM.
What port does syslog use?
Syslog uses UDP port 514 by default and TCP port 6514 for TLS-encrypted transport. Plain TCP syslog most often runs on TCP 514, although IANA assigns that port to a different service.
| Port | Transport | IANA service name | Defined in | When you’ll see it |
|---|---|---|---|---|
514/UDP |
UDP |
syslog |
RFC 5426 |
The traditional default. Fast and simple, with no delivery guarantee, ordering, or encryption. |
514/TCP |
Plain TCP |
shell (rsh) |
RFC 6587 (Historic) |
The de facto port for plain TCP syslog. It was never assigned to syslog. |
601/TCP |
BEEP |
syslog-conn |
RFC 3195 |
Reliable syslog over BEEP. Standardized in 2001, rarely deployed. |
6514/TCP |
TLS |
syslog-tls |
RFC 5425 |
The recommended transport for anything crossing an untrusted network. |
6514/UDP |
DTLS |
syslog-tls |
RFC 6012 |
The datagram TLS variant. Less common than TLS over TCP. |
TCP 514 is the row that trips up firewall reviews and audits. The IANA service name registry assigns UDP port 514 to syslog, but TCP port 514 to the old remote shell (rsh) service. RFC 6587, which documents how the industry has run syslog over TCP, acknowledges that TCP/514 became the most common choice even though the port "is actually assigned to the Shell protocol." The RFC carries Historic status, meaning it records existing practice rather than defining a standard, and its IESG note recommends the TLS transport from RFC 5425 over plain TCP.
For firewall planning, that translates into three practical rules:
-
Open UDP port 514 for legacy senders you can’t change.
-
Use TLS over TCP on port 6514 for everything else.
-
Treat any plain TCP syslog port as a site-specific convention that needs to be documented.
Inside a syslog message: PRI, facility, and severity
Both syslog formats begin with the same element: a priority value in angle brackets. The PRI value packs two codes into one number:
Priority = Facility × 8 + Severity
Take <34>, the value both RFCs use in their own examples.
Dividing 34 by 8 yields a facility of 4 (security/authorization messages) with a remainder of 2 (Critical).
A parser reverses the math: severity is PRI % 8, and facility is PRI / 8, rounded down.
Syslog severity levels
RFC 5424 Section 6.2.1 defines eight severity levels, 0 through 7, where lower numbers mean higher urgency. The descriptions below come from the RFC; the handling column reflects how security teams commonly treat each level.
| Code | Severity | RFC 5424 description | Typical handling in a SecOps pipeline |
|---|---|---|---|
0 |
Emergency |
System is unusable |
Page the on-call immediately and treat it as an outage. |
1 |
Alert |
Action must be taken immediately |
Route to a responder in real time. |
2 |
Critical |
Critical conditions |
Alert and investigate within minutes. |
3 |
Error |
Error conditions |
Create a ticket; correlate for recurring patterns. |
4 |
Warning |
Warning conditions |
Track on dashboards; alert on thresholds. |
5 |
Notice |
Normal but significant condition |
Index for hunting; authentication events often arrive here. |
6 |
Informational |
Informational messages |
Retain for correlation, audit, and forensics. |
7 |
Debug |
Debug-level messages |
Filter out or keep on short retention; enable on demand while troubleshooting. |
One caveat comes straight from the RFC: severities are subjective, and Appendix A.3 warns collectors against assuming every originator applies them the same way. A Critical from a printer driver and a Critical from your domain controller deserve different responses, so combine severity with facility and source in alert rules instead of keying on severity alone.
Syslog facility codes
The facility code identifies the type of program that produced a message. RFC 5424 Table 1 defines 24 facilities:
| Code | Facility |
|---|---|
0 |
Kernel messages |
1 |
User-level messages |
2 |
Mail system |
3 |
System daemons |
4 |
Security/authorization messages |
5 |
Messages generated internally by syslogd |
6 |
Line printer subsystem |
7 |
Network news subsystem |
8 |
UUCP subsystem |
9 |
Clock daemon |
10 |
Security/authorization messages |
11 |
FTP daemon |
12 |
NTP subsystem |
13 |
Log audit |
14 |
Log alert |
15 |
Clock daemon |
16-23 |
Local use 0-7 (local0-local7) |
Logging tools map keywords to these codes — auth for 4, daemon for 3, and so on — which is why logger(1) accepts a priority like auth.crit in place of a raw number.
Facilities 16-23 are intentionally left unassigned; use them to tag in-house applications or to separate device classes when everything funnels into one collector.
RFC 3164: the original BSD syslog format
RFC 3164, published in August 2001, carries Informational status. Its stated purpose was to describe the observed behavior of existing implementations, which is why so much variation survives among devices claiming to "speak syslog."
A BSD syslog message has three parts (PRI, HEADER, and MSG), which on the wire usually look like this:
<PRI>TIMESTAMP HOSTNAME TAG[PID]: MESSAGE
Here is Example 1 from Section 5.4 of the RFC:
<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8
Reading left to right: <34> is the priority (facility 4, severity 2, as calculated above).
Oct 11 22:14:15 is the timestamp in Mmm dd hh:mm:ss format.
mymachine is the hostname, su is the TAG naming the process, and everything after the colon is the CONTENT.
The format’s limitations are concrete, and they bite in production:
-
The timestamp has no year, no time zone, and no sub-second precision. Correlating events across regions, or across a year boundary, requires guesswork or out-of-band context.
-
The packet must stay at or under 1,024 bytes, which truncates stack traces, long URLs, and JSON payloads.
-
The TAG is capped at 32 alphanumeric characters, and the CONTENT is limited to printable ASCII characters 32-126, so Unicode has no defined representation.
-
There is no structured data. Everything after the TAG is free text; every vendor formats it differently, and parsing it means maintaining per-product patterns.
-
RFC 3164 defines UDP as the transport, with no delivery guarantee, ordering, integrity, or confidentiality.
RFC 5424: the IETF syslog protocol
RFC 5424, published in March 2009, obsoletes RFC 3164 and is the current standards-track definition of syslog. It keeps the PRI mechanism and replaces everything after it with a versioned, structured header:
<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG
The same event from the BSD example looks like this in RFC 5424 format (Section 6.5, Example 1):
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8
| Field | Value in the example | Notes |
|---|---|---|
PRI |
|
Same facility × 8 + severity calculation as BSD syslog. |
VERSION |
1 |
The protocol version; RFC 5424 defines version 1. |
TIMESTAMP |
2003-10-11T22:14:15.003Z |
Based on RFC 3339, the internet profile of ISO 8601: full date, time zone offset, and up to microsecond precision. |
HOSTNAME |
mymachine.example.com |
FQDN preferred, up to 255 characters. |
APP-NAME |
su |
The application name, up to 48 characters. |
PROCID |
- |
Process ID; |
MSGID |
ID47 |
Identifies the message type, up to 32 characters. |
STRUCTURED-DATA |
- |
None in this example. |
MSG |
BOM’su root' failed … |
Free-form text; should be UTF-8, signaled by the byte order mark (shown as BOM). |
STRUCTURED-DATA is the headline feature. It carries key-value pairs in named blocks, so a receiver can extract fields directly, with no guesswork about the message text. Example 3 from the RFC shows one element with three parameters:
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] BOMAn application event log entry...
The SD-ID (exampleSDID@32473) is namespaced with an IANA private enterprise number, so vendors can define their own fields without collisions.
The <165> decodes to facility 20 (local4) and severity 5 (Notice) with the same formula as before.
RFC 5424 also pins down message sizes: Section 6.1 requires every receiver to accept messages of at least 480 octets and recommends supporting 2,048, with individual transports free to allow more.
One structural change matters for network planning. RFC 5424 defines only the message format; transport moved into companion documents, RFC 5426 for UDP and RFC 5425 for TLS. That is why the port table above references those documents and not RFC 5424 itself.
RFC 3164 vs. RFC 5424: key differences
| RFC 3164 (BSD syslog) | RFC 5424 (IETF syslog) | |
|---|---|---|
Published |
August 2001 |
March 2009 |
IETF status |
Informational; obsoleted by RFC 5424 |
Proposed Standard |
Intent |
Documents observed behavior |
Prescribes a standard |
Timestamp |
|
RFC 3339 profile of ISO 8601; year, offset, up to microseconds |
Host identification |
Hostname or IP address |
FQDN preferred, up to 255 characters |
Application identification |
TAG (up to 32 alphanumeric characters) |
APP-NAME, PROCID, and MSGID fields |
Structured data |
None; free-form CONTENT |
STRUCTURED-DATA blocks with namespaced key-value pairs |
Character encoding |
Printable ASCII (32-126) |
UTF-8 with byte order mark in MSG |
Message size |
1,024 bytes maximum |
480 octets required, 2,048 recommended; transport-dependent |
Version field |
None |
VERSION (currently 1) |
Transport |
UDP, defined in the same document |
Separate RFCs: UDP (5426), TLS (5425) |
Which one should you use? Emit RFC 5424 wherever you control the sender — the timestamps alone justify it. On the receiving side, plan to accept both indefinitely. In our experience at NXLog, network appliances, embedded systems, and older Unix hosts still ship BSD-format messages, often with vendor-specific quirks on top, and that traffic won’t disappear on any schedule you control.
Collecting and forwarding syslog with NXLog Agent
NXLog Agent handles both formats through the Syslog extension, which provides parsers, format converters, and the octet framing required by TLS transport. The syslog integration guide covers the full range of scenarios; the three configurations below cover what most teams need first.
- Receive syslog on UDP 514 and parse it
-
The
parse_syslog()procedure detects BSD or IETF format automatically and populates fields such as$SyslogSeverity,$SyslogFacility,$Hostname, and$Messagein the event record<Extension syslog> Module xm_syslog </Extension> <Input syslog_udp> Module im_udp ListenAddr 0.0.0.0:514 Exec parse_syslog(); </Input>
| On Linux, binding to ports below 1024 requires elevated privileges. |
- Forward events as RFC 5424 over TLS
-
This output converts events with
to_syslog_ietf()and sends them to TCP 6514 using theSyslog_TLSoutput type, which implements the octet-counting framing defined in RFC 5425<Extension syslog> Module xm_syslog </Extension> <Output syslog_tls> Module om_ssl Host 192.168.1.1:6514 CAFile %CERTDIR%/ca.pem CertFile %CERTDIR%/agent-cert.pem CertKeyFile %CERTDIR%/agent-key.pem OutputType Syslog_TLS Exec to_syslog_ietf(); </Output> - Convert BSD syslog to IETF format in transit
-
A common relay pattern: accept legacy UDP 514 traffic from devices you can’t reconfigure, upgrade it to RFC 5424, and forward it over TCP
<Extension syslog> Module xm_syslog </Extension> <Input syslog_bsd> Module im_udp ListenAddr 0.0.0.0:514 Exec parse_syslog_bsd(); </Input> <Output syslog_ietf> Module om_tcp Host 192.168.1.101:1514 Exec to_syslog_ietf(); </Output> <Route syslog_bsd_to_ietf> Path syslog_bsd => syslog_ietf </Route>
To test any of these without touching production senders, generate a message with logger, which ships with util-linux:
$ logger --rfc5424 --server 192.168.1.100 --port 514 --udp -p auth.crit "syslog pipeline test"
The -p auth.crit flag produces facility 4, severity 2 — PRI 34, the same value as the RFC examples above.
When you run more than a handful of agents, NXLog Platform manages their configurations centrally and stores or relays what they collect, so you change a port or a certificate once instead of on every machine.
Syslog best practices for security operations
- Encrypt anything that crosses an untrusted network
-
Plain UDP and TCP syslog travel in cleartext. Use TLS on port 6514 — the direction the IESG itself points in RFC 6587 — and validate certificates on both ends.
- Keep UDP 514 off the internet
-
UDP provides no sender authentication, so any host that can reach the port can inject forged events. Restrict listeners to management networks and known source ranges.
- Normalize timestamps at the edge
-
Parse BSD messages as close to the source as you can and convert them to RFC 3339 in UTC before storage, while the collector still knows the sender’s time zone.
- Plan for loss and backpressure
-
UDP drops silently under load, and even TCP senders discard events when a collector stays down too long. Buffer at the agent and monitor queue depth so a collector outage results in minutes of delay rather than hours of evidence.
- Parse defensively and keep the raw event
-
RFC 3164 tolerates wide variation, and devices exercise all of it. Store the raw message alongside parsed fields so a parser bug can’t destroy the original record.
Conclusion
Syslog earned its place by being simple. One name still covers two message formats, three common ports (one of them unofficial), and transports with different delivery guarantees. Once you know where those seams are, the protocol becomes predictable.
Key takeaways:
-
Two RFCs define syslog. RFC 3164 documents the legacy BSD format; RFC 5424 is the current standard and obsoletes it.
-
The default syslog port is UDP 514. TLS transport uses TCP 6514, and TCP 514, though common, officially belongs to the rsh shell service.
-
Severity runs from 0 (Emergency) to 7 (Debug) and combines with a facility code into the PRI value: facility × 8 + severity.
-
RFC 5424 fixes the operational pain points: full timestamps with time zones, UTF-8, structured data, and defined message sizes.
-
Receive both formats, emit the new one. Legacy devices keep sending BSD syslog for years to come, so convert at the collection layer instead of waiting on vendors.
Get the ports right, normalize at ingest, and the rest of the pipeline gets easier. To collect, parse, and forward syslog at scale, see the syslog integration guide or explore how NXLog Platform centralizes agent management.
Frequently asked questions
- Is syslog UDP or TCP?
-
Both. RFC 5426 defines UDP transport on port 514, which remains the default in most implementations. Plain TCP is widespread but is documented only as a historical practice in RFC 6587. The recommended transport for new deployments is TLS over TCP port 6514, as defined in RFC 5425.
- Is port 514 TCP or UDP?
-
IANA assigns UDP 514 to syslog. TCP 514 officially belongs to the shell (rsh) service, so syslog’s use of it is a widespread convention rather than an assignment. If you need reliable delivery to an officially assigned port, use TLS over TCP on port 6514.
- What are the 8 syslog severity levels?
-
From most to least urgent: 0 Emergency, 1 Alert, 2 Critical, 3 Error, 4 Warning, 5 Notice, 6 Informational, and 7 Debug, as defined in RFC 5424 Section 6.2.1.
- What is the difference between RFC 3164 and RFC 5424?
-
RFC 3164 documents the original BSD syslog format: a timestamp without year or time zone, free-form ASCII text, and a 1,024-byte limit. RFC 5424 obsoletes it with a versioned header, RFC 3339 timestamps carrying time zones and sub-second precision, UTF-8 support, structured key-value data, and larger message sizes.
- Is RFC 3164 deprecated?
-
RFC 5424 formally obsoleted it in March 2009, and RFC 3164 was Informational rather than a standard to begin with. Devices still widely emit the BSD format, so collectors need to parse both formats for the foreseeable future.