Templates#
Templates define how rsyslog transforms data before output. They map parsed fields into schemas, format records, and generate dynamic destinations.
Overview#
Templates are a central concept in rsyslog. They sit at the point where parsed messages are transformed into their final structure. This includes:
Schema mapping in pipelines — normalize or rename parsed fields into a structured schema (e.g., ECS JSON).
Output generation — create custom message formats or dynamic filenames.
Textual transport formats — add headers when targeting syslog or other line-based transports.
Every output in rsyslog, from files to Elasticsearch to remote syslog, relies on templates. If no explicit template is bound, rsyslog uses built-in defaults compatible with classic syslog.
Message pipeline integration#
Templates appear between parsing and actions. They define what data is sent forward:
Choosing a template type#
Use List template type to map fields one by one (rename keys, add or drop fields, inject constants) and build JSON safely with
jsonforjsonftree.Use Subtree template type to serialize a prepared JSON tree (for example, after JSON Structured Content Extraction Module (mmjsonparse) or LEEF Structured Content Extraction Module (mmleefparse) populated
$!ecs).Use String template type for simple text records (legacy syslog lines, CSV, or other plain-text formats).
Use Plugin template type for special encodings provided by modules.
Schema mapping with JSONF#
Modern pipelines should prefer structured JSON. The recommended method is:
Enable JSON-safe encoding with
option.jsonf="on". Useoption.jsonftree="on"instead when you want dottedoutnamesegments to become nested JSON objects automatically.For each field, use property() or constant() with
format="jsonf".For pre-normalized data, serialize a complete subtree such as
$!ecswith a subtree template.
This ensures correct escaping and avoids handcrafted JSON concatenation.
Detailed examples are provided in the template type pages.
Templates for textual transports#
When the target transport expects textual records (for example, classic syslog receivers, line-based file formats, or CSV), the template must include a transport header. This is required so receivers can parse message boundaries and metadata.
Typical cases:
Syslog protocols (RFC5424, RFC3164, protocol-23 draft) Require a syslog header (timestamp, hostname, tag).
Text file formats Such as
RSYSLOG_FileFormatorRSYSLOG_TraditionalFileFormat, which prepend headers before the message body.Custom plain-text records Where a template explicitly builds a line with fields separated by spaces, commas, or tabs.
Predefined reserved templates like RSYSLOG_ForwardFormat or
RSYSLOG_SyslogProtocol23Format exist for these purposes.
If your output is a structured JSON pipeline (e.g. to Elasticsearch or a file), you do not need to add any textual header.
The template() object#
Templates are defined with the template() object, a static construct
processed when rsyslog reads the configuration. Basic syntax:
template(name="..." type="...")
List templates additionally support a block form:
template(name="..." type="list" option.jsonftree="on") {
property(outname="field" name="msg" format="jsonf")
constant(outname="@version" value="1" format="jsonf")
}
See the type-specific subpages for details.
Template types#
Topic |
Summary |
|---|---|
List templates build output from a sequence of constant and property statements. They are ideal for schema mapping when fields must be added one by one. |
|
Builds output from a full JSON subtree (CEE). Best used when the schema has already been remapped and an appropriate variable tree exists. |
|
Uses a single template string mixing constants and replacement variables. Best suited for textual output with simple manipulation needs. |
|
Delegates string generation to a plugin for maximum performance. Configuration selects the plugin by name. |
Template statements#
Topic |
Summary |
|---|---|
Outputs literal text. Supports escape sequences and optional JSON field formatting when an outname and format are specified. |
|
Extracts and optionally transforms message properties. Supports substring, case, regex, JSON formatting, and more. |
Additional topics#
Topic |
Summary |
|---|---|
Global modifiers applied to a template. Include SQL and JSON helpers and case sensitivity control. |
|
Practical templates for files, forwarding, databases, JSON output, and dynamic file names. |
|
Names beginning with |
|
Historic syntax supporting only string templates. Kept for compatibility with older configurations. |
Reserved template names overview#
These names provide predefined formats mainly for compatibility. For modern JSON pipelines, prefer custom list or subtree templates.
Name |
Purpose |
|---|---|
RSYSLOG_TraditionalFileFormat |
Old style log file format |
RSYSLOG_FileFormat |
Modern logfile format with high-precision timestamps |
RSYSLOG_TraditionalForwardFormat |
Traditional forwarding with low-precision timestamps |
RSYSLOG_SysklogdFileFormat |
Sysklogd compatible format |
RSYSLOG_ForwardFormat |
High-precision forwarding format |
RSYSLOG_SyslogProtocol23Format |
Format from IETF draft syslog-protocol-23 |
RSYSLOG_DebugFormat |
Troubleshooting format listing all properties |
RSYSLOG_WallFmt |
Host and time followed by tag and message |
RSYSLOG_StdUsrMsgFmt |
Syslogtag followed by the message |
RSYSLOG_StdDBFmt |
Insert command for MariaDB/MySQL |
RSYSLOG_StdPgSQLFmt |
Insert command for PostgreSQL |
RSYSLOG_spoofadr |
Sender IP address only |
RSYSLOG_StdJSONFmt |
JSON structure of message properties |
Legacy $template statement#
For historical configurations, the legacy $template syntax is still
recognized. See Legacy $template statement for details.
See also#
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.