GELF forwarding in rsyslog

Forward rsyslog messages to Graylog by rendering a GELF JSON template and using omfwd with UDP or TCP framing.

Written by Florian Riedl

Situation

The current setup has a system with rsyslog as the central syslog server and a system with Graylog for storage and analyzing the log messages. Graylog expects the log messages to arrive in GELF (Graylog Extended Log Format).

Changing the default log format to GELF

To make rsyslog send GELF we basically need to create a custom template. This template will define the format in which the log messages will get sent to Graylog.

template(name="gelf" type="list" option.jsonf="on") {
    constant(outname="version" value="1.1" format="jsonf")
    property(outname="host" name="hostname" format="jsonf")
    property(outname="short_message" name="msg" format="jsonf")
    property(outname="timestamp" name="timegenerated"
             dateformat="unixtimestamp" datatype="number" format="jsonf")
    property(outname="level" name="syslogseverity"
             datatype="number" format="jsonf")
    property(outname="_app_name" name="app-name" format="jsonf")
    property(outname="_syslog_facility" name="syslogfacility-text"
             format="jsonf")
}

This list template uses option.jsonf="on" and format="jsonf" so rsyslog adds JSON braces, commas, field names, and string escaping. The timestamp and level fields are emitted as JSON numbers, which avoids Graylog warnings about string-typed GELF fields. The _app_name and _syslog_facility fields are optional GELF additional fields.

Applying the template to a syslog action

The next step is applying the template to our output action. Since we are forwarding log messages to Graylog, this is usually a syslog sending action.

# syslog forwarder via UDP
action(type="omfwd" target="graylogserver" port="12201" protocol="udp" template="gelf")

We now have a syslog forwarding action. This uses the omfwd module. Please note that the case above only works for UDP transport. When using TCP, Graylog expects a null byte as message delimiter. To use TCP, configure the delimiter via the TCP_FrameDelimiter parameter of the omfwd module.

# syslog forwarder via TCP
action(type="omfwd" target="graylogserver" port="12201" protocol="tcp" template="gelf" TCP_FrameDelimiter=0 KeepAlive="on")

Conclusion

With this quick and easy setup you can feed Graylog with the correct log message format so it can do its work. This case can be applied to a lot of different scenarios as well, but with different templates.

This documentation is part of the rsyslog project.


Support: rsyslog Assistant | GitHub Discussions | GitHub Issues: rsyslog source project

Contributing: Source & docs: rsyslog source project

© 2008–2026 Rainer Gerhards and others. Licensed under the Apache License 2.0.