diff options
Diffstat (limited to '')
-rw-r--r-- | source/configuration/templates.rst | 908 |
1 files changed, 908 insertions, 0 deletions
diff --git a/source/configuration/templates.rst b/source/configuration/templates.rst new file mode 100644 index 0000000..e602241 --- /dev/null +++ b/source/configuration/templates.rst @@ -0,0 +1,908 @@ +********* +Templates +********* + +Description +=========== + +Templates are a key feature of rsyslog. They allow to specify any format +a user might want. They are also used for dynamic file name generation. +Every output in rsyslog uses templates - this holds true for files, user +messages and so on. The database writer expects its template to be a +proper SQL statement - so this is highly customizable too. You might ask +how does all of this work when no templates at all are specified. Good +question ;). The answer is simple, though. Templates compatible with the +stock syslogd formats are hardcoded into rsyslogd. So if no template is +specified, we use one of those hardcoded templates. Search for +"template\_" in rsconf.c and you will find the hardcoded ones. + +Templates are specified by template() objects. They can also be +specified via $template legacy statements. + +.. note:: + + Note: key elements of templates are rsyslog properties. See the + :doc:`rsyslog properties reference <properties>` for a list of which + are available. + + +Template processing +=================== + +Due to lack of standardization regarding logs formats, when a template is +specified it's supposed to include HEADER, as defined in `RFC5424 <https://tools.ietf.org/html/rfc5424>`_ + +It's very important to have this in mind, and also to understand how +`rsyslog parsing <http://www.rsyslog.com/doc/syslog_parsing.html>`_ works. + +For example, if the MSG field is set to "this:is a message" and neither HOSTNAME +nor TAG are specified, the outgoing parser will split the message as: + +.. code-block:: none + + TAG:this: + MSG:is a message + + +The template() object +===================== + +The template() object is used to define templates. Note that it is a +**static** object, that means all templates are defined when rsyslog +reads the config file. As such, templates are not affected by +if-statements or config nesting. + +The basic structure of the template object is as follows: + +.. code-block:: none + + template(parameters) + +In addition to this simpler syntax, list templates (to be described +below) support an extended syntax: + +.. code-block:: none + + template(parameters) { list-descriptions } + +Each template has a parameter **name**, which specifies the template +name, and a parameter **type**, which specifies the template type. The +name parameter must be unique, and behaviour is unpredictable if it is +not. The **type** parameter specifies different template types. +Different types simply enable different ways to specify the template +content. The template type **does not** affect what an (output) plugin +can do with it. So use the type that best fits your needs (from a config +writing point of view!). The following types are available: + +- list +- subtree +- string +- plugin + +The various types are described below. + +List +---- + +In this case, the template is generated by a list of constant and +variable statements. These follow the template spec in curly braces. +This type is also primarily meant to be used with structure-aware outputs, +like ommongodb. However, it also works perfectly with text-based +outputs. We recommend to use this mode if more complex property +substitutions need to be done. In that case, the list-based template +syntax is much clearer than the simple string-based one. + +The list template contains the template header (with **type="list"**) +and is followed by **constant** and **property** statements, given in +curly braces to signify the template statement they belong to. As the +name says, **constant** statements describe constant text and +**property** describes property access. There are many options to +**property**, described further below. Most of these options are used to +extract only partial property contents or to modify the text obtained +(for instance to change its case to upper or lower case). + +To grasp the idea, an actual sample is: + +.. code-block:: none + + template(name="tpl1" type="list") { + constant(value="Syslog MSG is: '") + property(name="msg") + constant(value="', ") + property(name="timereported" dateFormat="rfc3339" caseConversion="lower") + constant(value="\n") + } + +This sample is probably primarily targeted at the usual file-based +output. + +Constant statement +^^^^^^^^^^^^^^^^^^ + +This provides a way to specify constant text. The text is used +literally. It is primarily intended for text-based output, so that some +constant text can be included. For example, if a complex template is +built for file output, one usually needs to finish it by a newline, +which can be introduced by a constant statement. Here is an actual +sample of that use case from the rsyslog testbench: + +:: + + template(name="outfmt" type="list") { + property(name="$!usr!msgnum") + constant(value="\n") + } + +The following escape sequences are recognized inside the constant text: + +- \\\\ - single backslash +- \\n - LF +- \\ooo - (three octal digits) - represents a character with this + octal numerical value (e.g. \\101 equals "A"). Note that three octal digits + must be given (in contrast to some languages, where between one and + three are valid). While we support octal notation, we recommend to + use hex notation as this is better known. +- \\xhh - (where h is a hex digit) - represents a character with this + hexadecimal numerical value (e.g. \\x41 equals "A"). Note that two hexadecimal + digits must be given (in contrast to some languages where either one or two + are valid). +- ... some others ... list needs to be extended + +Note: if an unsupported character follows a backslash, this is treated +as an error. Behaviour is unpredictable in this case. + +To aid usage of the same template both for text-based outputs and +structured ones, constant text without an "outname" parameter will be +ignored when creating the name/value tree for structured outputs. So if +you want to supply some constant text e.g. to mongodb, you must include +an outname, as can be seen here: + +.. code-block:: none + + template(name="outfmt" type="list") { + property(name="$!usr!msgnum") + constant(value="\n" outname="IWantThisInMyDB") + } + +To generate a constant json field, the `format` parameter can be used, as +in this example + +.. code-block:: none + + template(name="outfmt" type="list" option.jsonf="on") { + property(outname="message" name="msg" format="jsonf") + constant(outname="@version" value="1" format="jsonf") + } + +The constant statement in this case will generate `"@version":"1"`. Note that to do +this, both the `value` and the `format` parameters must be given. + +The "constant" statement supports the following parameters: + +- value - the constant value to use +- outname - the output field name (for structured outputs) +- format - can be either empty or `jsonf` + + +Property statement +^^^^^^^^^^^^^^^^^^ + +This statement is used to include property values. It can access all +properties. Also, options permit to specify picking only part of a +property or modifying it. It supports the following parameters: + +- **name** - the name of the property to access + +- **outname** - the output field name (for structured outputs) + +- **dateformat** - the date format to use (only for date-related properties). + `Here <property_replacer.html#property-options>`_ you can find a list of all + property options. **TODO:** right now, the property replacer documentation + contains property format options for string templates, only. The formats for + non-string templates differ. For example, date format options in string + templates start with "date-" whereas those in property statements do not + (e.g. "date-year" vs. just "year"). The technical reason behind this is + that inside string templates, the option must include what it applies + to whereas with the explicit format that is part of the parameter name. + + To create a customised format you can use multiple property options + together. The following example would result in **YYYY-MM-DD**: + +.. code-block:: none + + property(name="timereported" dateformat="year") + constant(value="-") + property(name="timereported" dateformat="month") + constant(value="-") + property(name="timereported" dateformat="day") + +- **date.inUTC** - date shall be shown in UTC (please note that this + requires a bit more performance due to the necessary conversions) + Available since 8.18.0. + +- **caseconversion** - permits to convert case of the text. Supported + values are "lower" and "upper" + +- **controlcharacters** - specifies how to handle control characters. + Supported values are "escape", which escapes them, "space", which + replaces them by a single space, and "drop", which simply removes + them from the string. + +- **securepath** - used for creating pathnames suitable for use in dynafile + templates. Supported values are "drop" and "replace". + +- **format** - specify format on a field basis. Supported values are: + + - "`csv <property_replacer.html#csv>`_\ " for use when csv-data is + generated + - "`json <property_replacer.html#json>`_\ " which formats proper + json content (but without a field header) + - "`jsonf <property_replacer.html#jsonf>`_\ " which formats as a + complete json field + - "`jsonr <property_replacer.html#jsonr>`_\ " which avoids double + escaping the value but makes it safe for a json field + - "`jsonfr <property_replacer.html#jsonfr>`_\ " which is the + combination of "jsonf" and "jsonr". + +- **position.from** - obtain substring starting from this position (1 is + the first position) + +- **position.to** - obtain substring up to this position. As a special + extension available since 8.2302.0. the `position.to` value may be + negative (-n). In this case, all characters from `position.from` to the + end of the actual property string except the last n characters are extracted. + This makes it easy to strip the beginning and end of a string with changing + legth. Let us assume you have a string `"[abc]"` and want to remove the + braces. In this case, use `position.from="2" position.to="-1"` in the + `property()` object. This will result in the string `"abc"` after template + processing. This is especially useful if you want to drop the braces around + the `STRUCTURED-DATA` message property. + +- **position.relativeToEnd** - the from and to position is relative to the + end of the string instead of the usual start of string. (available + since rsyslog v7.3.10) + +- **fixedwidth** - changes behaviour of position.to so that it pads the + source string with spaces up to the value of position.to if the source + string is shorter. "on" or "off" (default) (available since rsyslog + v8.13.0) + +- **compressspace** - compresses multiple spaces (US-ASCII SP character) + inside the string to a single one. This compression happens at a very + late stage in processing. Most importantly, it happens after substring + extraction, so the **position.from** and **position.to** positions + are **NOT** affected by this option. (available since v8.18.0). + +- **field.number** - obtain this field match + +- **field.delimiter** - decimal value of delimiter character for field + extraction + +- **regex.expression** - expression to use + +- **regex.type** - either ERE or BRE + +- **regex.nomatchmode** - what to do if we have no match + +- **regex.match** - match to use + +- **regex.submatch** - submatch to use + +- **droplastlf** - drop a trailing LF, if it is present + +- **mandatory** - signifies a field as mandatory. If set to "on", this + field will always be present in data passed to structured outputs, + even if it is empty. If "off" (the default) empty fields will not be + passed to structured outputs. This is especially useful for outputs + that support dynamic schemas (like ommongodb). + +- **spifno1stsp** - expert options for RFC3164 template processing + +- **datatype** - for "jsonf" format ONLY; permits to set a datatype + Log messages as string data types natively. Thus every property inside + rsyslog is string based. However, in some end systems you need different + data types like numbers of boolean. This setting, in jsonf mode, permits + to configure a desired data type. Supported data types are: + + - number - value is treated as a JSON number and not enclosed in quotes. + If the property is empty, the value 0 is generated. + - string - value is a string and enclosed in quotes + - auto - value is treated as number if numeric and as string otherwise. + The current implementation treats only integers as numeric to avoid + confusion. + - bool - the value is treated as boolean. If it is empty or 0, it will + generate "false", else "true". + + If not specified, 'string' datatype is assumed. + This is a feature of rsyslog 8.1905.0 or later. + +- **onEmpty** - for "jsonf" format ONLY; specifies how empty values + shall be handled. Possible values are: + + - keep - emit the empty element + - skip - completely ignore the element, do not emit anything + - null - emit a JSON 'null' value + + If not specified, 'keep' is assumed. + This is a feature of rsyslog 8.1905.0 or later. + + +Subtree +------- + +Available since rsyslog 7.1.4 + +In this case, the template is generated based on a complete (CEE) +subtree. This type of template is most useful for outputs that know how +to process hierarchical structure, like ommongodb. With that type, the +parameter **subtree** must be specified, which tells which subtree to +use. For example template(name="tpl1" type="subtree" subtree="$!") +includes all CEE data, while template(name="tpl2" type="subtree" +subtree="$!usr!tpl2") includes only the subtree starting at $!usr!tpl2. +The core idea when using this type of template is that the actual data +is prefabricated via set and unset script statements, and the resulting +structure is then used inside the template. This method MUST be used if +a complete subtree needs to be placed *directly* into the object's root. +With all other template types, only subcontainers can be generated. Note +that subtree type can also be used with text-based outputs, like omfile. +HOWEVER, you do not have any capability to specify constant text, and as +such cannot include line breaks. As a consequence, using this template +type for text outputs is usually only useful for debugging or very +special cases (e.g. where the text is interpreted by a JSON parser later +on). + + +Use case +^^^^^^^^ + +A typical use case is to first create a custom subtree and then include +it into the template, like in this small example: + +.. code-block:: none + + set $!usr!tpl2!msg = $msg; + set $!usr!tpl2!dataflow = field($msg, 58, 2); + template(name="tpl2" type="subtree" subtree="$!usr!tpl2") + + +Here, we assume that $msg contains various fields, and the data from a +field is to be extracted and stored - together with the message - as +field content. + + +String +------ + +This closely resembles the legacy template statement. It has a mandatory +parameter **string**, which holds the template string to be applied. A +template string is a mix of constant text and replacement variables (see +property replacer). These variables are taken from message or other +dynamic content when the final string to be passed to a plugin is +generated. String-based templates are a great way to specify textual +content, especially if no complex manipulation to properties is +necessary. + +This is a sample for a string-based template: + +.. code-block:: none + + template(name="tpl3" type="string" + string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" + ) + + +The text between percent signs ('%') is interpreted by the rsyslog +:doc:`property replacer <property_replacer>`. In a nutshell, +it contains the property to use as well as options for formatting +and further processing. This is very similar to what the ``property`` +object in list templates does (it actually is just a different language to +express most of the same things). + +Everything outside of the percent signs is constant text. In the +above case, we have mostly spaces between the property values. At the +end of the string, an escape sequence is used. + +Escape sequences permit to specify nonprintable characters. They work +very similar to escape sequences in C and many other languages. They +are initiated by the backslash characters and followed by one or more +characters that specify the actual character. For example \\7 is the +US-ASCII BEL character and \\n is a newline. The set is similar to +what C and perl support, but a bit more limited. + + +Plugin +------ + +In this case, the template is generated by a plugin (which is then +called a "strgen" or "string generator"). The format is fixed as it is +coded. While this is inflexible, it provides superior performance, and +is often used for that reason (not that "regular" templates are slow - +but in very demanding environments that "last bit" can make a +difference). Refer to the plugin's documentation for further details. +For this type, the parameter **plugin** must be specified and must +contain the name of the plugin as it identifies itself. Note that the +plugin must be loaded prior to being used inside a template. +Config example: + + ``template(name="tpl4" type="plugin" plugin="mystrgen")`` + + +Options +^^^^^^^ + +The <options> part is optional. It carries options influencing the +template as a whole and is a part of the template parameters. See details +below. Be sure NOT to mistake template options with property options - +the latter ones are processed by the property replacer and apply to a +SINGLE property, only (and not the whole template). +Template options are case-insensitive. Currently defined are: + +**option.sql** - format the string suitable for a SQL statement in MySQL +format. This will replace single quotes ("'") and the backslash +character by their backslash-escaped counterpart ("\\'" and "\\\\") +inside each field. Please note that in MySQL configuration, the +``NO_BACKSLASH_ESCAPES`` mode must be turned off for this format to work +(this is the default). + +**option.stdsql** - format the string suitable for a SQL statement that +is to be sent to a standards-compliant sql server. This will replace +single quotes ("'") by two single quotes ("''") inside each field. You +must use stdsql together with MySQL if in MySQL configuration the +``NO_BACKSLASH_ESCAPES`` is turned on. + +**option.json** - format the string suitable for a json statement. This +will replace single quotes ("'") by two single quotes ("''") inside each +field. + +**option.jsonf** - format the string as JSON object. This means a leading +and trailing curly brace "{" will be added as well as a comma between all +non-terminal properties and constants. + +**option.casesensitive** - treat property name references as case +sensitive. The default is "off", where all property name references are +first converted to lowercase during template definition. With this +option turned "on", property names are looked up as defined in the +template. Use this option if you have JSON (``$!*``), local (``!.*``), +or global (``$!\\*``) properties which contain uppercase letters. The +normal Rsyslog properties are case-insensitive, so this option is not +needed for properly referencing those properties. + +Use of the options **option.sql**, **option.stdsql**, and +**option.json** are mutually exclusive. Using more than one at the same +time can cause unpredictable behaviour. + +Either the **sql** or **stdsql** option **must** be specified when a +template is used for writing to a database, otherwise injection might +occur. Please note that due to the unfortunate fact that several vendors +have violated the sql standard and introduced their own escape methods, +it is impossible to have a single option doing all the work. So you +yourself must make sure you are using the right format. **If you choose +the wrong one, you are still vulnerable to sql injection.** +Please note that the database writer *checks* that the sql option is +present in the template. If it is not present, the write database action +is disabled. This is to guard you against accidentally forgetting it and +then becoming vulnerable to SQL injection. The sql option can also be +useful with files - especially if you want to import them into a +database on another machine for performance reasons. However, do NOT use +it if you do not have a real need for it - among others, it takes some +toll on the processing time. Not much, but on a really busy system you +might notice it. + +The default template for the write to database action has the sql option +set. As we currently support only MySQL and the sql option matches the +default MySQL configuration, this is a good choice. However, if you have +turned on ``NO_BACKSLASH_ESCAPES`` in your MySQL config, you need to +supply a template with the stdsql option. Otherwise you will become +vulnerable to SQL injection. + +.. code-block:: none + + template (name="TraditionalFormat" type="string" + string="%timegenerated% %HOSTNAME% %syslogtag%%msg%\\n") + + +Examples +======== + +Standard Template for Writing to Files +-------------------------------------- + +.. code-block:: none + + template(name="FileFormat" type="list") { + property(name="timestamp" dateFormat="rfc3339") + constant(value=" ") + property(name="hostname") + constant(value=" ") + property(name="syslogtag") + property(name="msg" spifno1stsp="on" ) + property(name="msg" droplastlf="on" ) + constant(value="\n") + } + +The equivalent string template looks like this: + +.. code-block:: none + + template(name="FileFormat" type="string" + string= "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" + ) + + +.. note:: + + The template string itself must be on a single line. + + +Standard Template for Forwarding to a Remote Host (RFC3164 mode) +---------------------------------------------------------------- + +.. code-block:: none + + template(name="ForwardFormat" type="list") { + constant(value="<") + property(name="pri") + constant(value=">") + property(name="timestamp" dateFormat="rfc3339") + constant(value=" ") + property(name="hostname") + constant(value=" ") + property(name="syslogtag" position.from="1" position.to="32") + property(name="msg" spifno1stsp="on" ) + property(name="msg") + } + +The equivalent string template looks like this: + +.. code-block:: none + + template(name="forwardFormat" type="string" + string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%" + ) + +.. note:: + + The template string itself must be on a single line. + + +Standard Template for writing to the MySQL database +--------------------------------------------------- + +.. code-block:: none + + template(name="StdSQLformat" type="list" option.sql="on") { + constant(value="insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag)") + constant(value=" values ('") + property(name="msg") + constant(value="', ") + property(name="syslogfacility") + constant(value=", '") + property(name="hostname") + constant(value="', ") + property(name="syslogpriority") + constant(value=", '") + property(name="timereported" dateFormat="mysql") + constant(value="', '") + property(name="timegenerated" dateFormat="mysql") + constant(value="', ") + property(name="iut") + constant(value=", '") + property(name="syslogtag") + constant(value="')") + } + +The equivalent string template looks like this: + +.. code-block:: none + + template(name="stdSQLformat" type="string" option.sql="on" + string="insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%', %syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')" + ) + +.. note:: + + The template string itself must be on a single line. + + +Generating JSON +--------------- + +This is especially useful for RESTful APIs, like for example ElasticSearch provides. + +This template + +.. code-block:: none + + template(name="outfmt" type="list" option.jsonf="on") { + property(outname="@timestamp" name="timereported" dateFormat="rfc3339" format="jsonf") + property(outname="host" name="hostname" format="jsonf") + property(outname="severity" name="syslogseverity" caseConversion="upper" format="jsonf" datatype="number") + property(outname="facility" name="syslogfacility" format="jsonf" datatype="number") + property(outname="syslog-tag" name="syslogtag" format="jsonf") + property(outname="source" name="app-name" format="jsonf" onEmpty="null") + property(outname="message" name="msg" format="jsonf") + + } + +Generates output similar to this + +.. code-block:: none + + {"@timestamp":"2018-03-01T01:00:00+00:00", "host":"172.20.245.8", "severity":7, "facility":20, "syslog-tag":"tag", "source":"tag", "message":" msgnum:00000000:"} + +Pretty-printed this looks like + +.. code-block:: none + + { + "@timestamp": "2018-03-01T01:00:00+00:00", + "host": "172.20.245.8", + "severity": 7, + "facility": 20, + "syslog-tag": "tag", + "source": "tag", + "message": " msgnum:00000000:" + } + + +.. note:: + + The output is **not** pretty-printed as this is just waste of resources when + used in RESTful APIs. + +If the "app-name" property is empty, a JSON null value is generated as the `onEmpty="null"` +parameter is used + +.. code-block:: none + + {"@timestamp":"2018-03-01T01:00:00+00:00", "host":"172.20.245.8", "severity":7, "facility":20, "syslog-tag":"tag", "source":null, "message":" msgnum:00000000:"} + + +Creating Dynamic File Names for omfile +-------------------------------------- + +Templates can be used to generate actions with dynamic file names. +For example, if you would like to split syslog messages from different hosts +to different files (one per host), you can define the following template: + +.. code-block:: none + + template (name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log") + + +Reserved Template Names +----------------------- + +Template names beginning with "RSYSLOG\_" are reserved for rsyslog use. +Do NOT use them, otherwise you may cause conflicts in the future +(and quite unpredictable behaviour). There is a small set of pre-defined +templates that you can use without the need to define them: + +**RSYSLOG_TraditionalFileFormat** - The "old style" default log file +format with low-precision timestamps. + +.. code-block:: none + + template(name="RSYSLOG_TraditionalFileFormat" type="string" + string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n") + +**RSYSLOG_FileFormat** - A modern-style logfile format similar to +TraditionalFileFormat, both with high-precision timestamps and +timezone information. + +.. code-block:: none + + template(name="RSYSLOG_FileFormat" type="list") { + property(name="timereported" dateFormat="rfc3339") + constant(value=" ") + property(name="hostname") + constant(value=" ") + property(name="syslogtag") + property(name="msg" spifno1stsp="on") + property(name="msg" droplastlf="on") + constant(value="\n") + } + +**RSYSLOG_TraditionalForwardFormat** - The traditional forwarding format +with low-precision timestamps. Most useful if you send messages to +other syslogd's or rsyslogd below version 3.12.5. + +.. code-block:: none + + template(name="RSYSLOG_TraditionalForwardFormat" type="string" + string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%") + +**RSYSLOG_SysklogdFileFormat** - Sysklogd compatible log file format. If +used with options: ``$SpaceLFOnReceive on``, +``$EscapeControlCharactersOnReceive off``, ``$DropTrailingLFOnReception off``, +the log format will conform to sysklogd log format. + +.. code-block:: none + + template(name="RSYSLOG_SysklogdFileFormat" type="string" + string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg%\n") + +**RSYSLOG_ForwardFormat** - a new high-precision forwarding format very +similar to the traditional one, but with high-precision timestamps +and timezone information. Recommended to be used when sending +messages to rsyslog 3.12.5 or above. + +.. code-block:: none + + template(name="RSYSLOG_ForwardFormat" type="string" + string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%") + +**RSYSLOG_SyslogProtocol23Format** - the format specified in IETF's +internet-draft ietf-syslog-protocol-23, which is very close to the actual +syslog standard `RFC5424 <https://tools.ietf.org/html/rfc5424>`_ (we couldn't +update this template as things were in production for quite some time when +RFC5424 was finally approved). This format includes several improvements. +You may use this format with all relatively recent versions of rsyslog or syslogd. + +.. code-block:: none + + template(name="RSYSLOG_SyslogProtocol23Format" type="string" + string="<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n") + +**RSYSLOG_DebugFormat** - a special format used for troubleshooting +property problems. This format is meant to be written to a log file. +Do **not** use for production or remote forwarding. + +.. code-block:: none + + template(name="RSYSLOG_DebugFormat" type="list") { + constant(value="Debug line with all properties:\nFROMHOST: '") + property(name="fromhost") + constant(value="', fromhost-ip: '") + property(name="fromhost-ip") + constant(value="', HOSTNAME: '") + property(name="hostname") + constant(value="', PRI: '") + property(name="pri") + constant(value=",\nsyslogtag '") + property(name="syslogtag") + constant(value="', programname: '") + property(name="programname") + constant(value="', APP-NAME: '") + property(name="app-name") + constant(value="', PROCID: '") + property(name="procid") + constant(value="', MSGID: '") + property(name="msgid") + constant(value="',\nTIMESTAMP: '") + property(name="timereported") + constant(value="', STRUCTURED-DATA: '") + property(name="structured-data") + constant(value="',\nmsg: '") + property(name="msg") + constant(value="'\nescaped msg: '") + property(name="msg" controlcharacters="drop") + constant(value="'\ninputname: ") + property(name="inputname") + constant(value=" rawmsg: '") + property(name="rawmsg") + constant(value="'\n$!:") + property(name="$!") + constant(value="\n$.:") + property(name="$.") + constant(value="\n$/:") + property(name="$/") + constant(value="\n\n") + } + +**RSYSLOG_WallFmt** - Contains information about the host and the time the +message was generated and at the end the syslogtag and message itself. + +.. code-block:: none + + template(name="RSYSLOG_WallFmt" type="string" + string="\r\n\7Message from syslogd@%HOSTNAME% at %timegenerated% ...\r\n%syslogtag%%msg%\n\r") + +**RSYSLOG_StdUsrMsgFmt** - The syslogtag followed by the message is returned. + +.. code-block:: none + + template(name="RSYSLOG_StdUsrMsgFmt" type="string" + string=" %syslogtag%%msg%\n\r") + +**RSYSLOG_StdDBFmt** - Generates a insert command with the message +properties, into table SystemEvents for a mysql database. + +.. code-block:: none + + template(name="RSYSLOG_StdDBFmt" type="list") { + constant(value="insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag)") + constant(value=" values ('") + property(name="msg") + constant(value="', ") + property(name="syslogfacility") + constant(value=", '") + property(name="hostname") + constant(value="', ") + property(name="syslogpriority") + constant(value=", '") + property(name="timereported" dateFormat="date-mysql") + constant(value="', '") + property(name="timegenerated" dateFormat="date-mysql") + constant(value="', ") + property(name="iut") + constant(value=", '") + property(name="syslogtag") + constant(value="')") + } + +**RSYSLOG_StdPgSQLFmt** - Generates a insert command with the message +properties, into table SystemEvents for a pgsql database. + +.. code-block:: none + + template(name="RSYSLOG_StdPgSQLFmt" type="string" + string="insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, + ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%', + %syslogpriority%, '%timereported:::date-pgsql%', '%timegenerated:::date-pgsql%', %iut%, + '%syslogtag%')") + +**RSYSLOG_spoofadr** - Generates a message containing nothing more than +the ip address of the sender. + +.. code-block:: none + + template(name="RSYSLOG_spoofadr" type="string" string="%fromhost-ip%") + +**RSYSLOG_StdJSONFmt** - Generates a JSON structure containing the message +properties. + +.. code-block:: none + + template(name="RSYSLOG_StdJSONFmt" type="string" + string="{\"message\":\"%msg:::json%\",\"fromhost\":\"%HOSTNAME:::json%\",\"facility\": + \"%syslogfacility-text%\",\"priority\":\"%syslogpriority-text%\",\"timereported\": + \"%timereported:::date-rfc3339%\",\"timegenerated\": + \"%timegenerated:::date-rfc3339%\"}") + + + +The LEGACY \$template statement +=============================== + +Legacy format provides limited functionality, but is still frequently used. +So you probably need to at least be able to understand them. Legacy format +is also good for fairly simple templates. + +In legacy, only string templates are supported. The full format is as follows: + +.. code-block:: none + + $template myname,<string-template> + +Here, *myname* is the name of the template (like the *name="myname"* property in +modern template format). The *<string-template>* is exactly the *string* property +like in modern template format. + +Take for example the following modern template object: + +.. code-block:: none + + template(name="tpl3" type="string" + string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" + ) + + +It translates to the following legacy template statement: + +.. code-block:: none + + $template tpl3,"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" + + + +See Also +-------- + +- `How to bind a + template <http://www.rsyslog.com/how-to-bind-a-template/>`_ +- `Adding the BOM to a + message <http://www.rsyslog.com/adding-the-bom-to-a-message/>`_ +- `How to separate log files by host name of the sending + device <http://www.rsyslog.com/article60/>`_ + |