summaryrefslogtreecommitdiffstats
path: root/source/configuration/properties.rst
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/configuration/properties.rst322
1 files changed, 322 insertions, 0 deletions
diff --git a/source/configuration/properties.rst b/source/configuration/properties.rst
new file mode 100644
index 0000000..863984f
--- /dev/null
+++ b/source/configuration/properties.rst
@@ -0,0 +1,322 @@
+rsyslog Properties
+==================
+
+Data items in rsyslog are called "properties". They can have different
+origin. The most important ones are those that stem from received
+messages. But there are also others. Whenever you want to access data items,
+you need to access the respective property.
+
+Properties are used in
+
+- :doc:`templates <templates>`
+- conditional statements
+
+The property name is case-insensitive (prior to 3.17.0, they were case-sensitive).
+
+Note: many users refer to "rsyslog properties" as "rsyslog variables". You can treat
+them as synonymous.
+Read how `rsyslog lead author Rainer Gerhards explains the naming
+difference <https://rainer.gerhards.net/2020/08/rsyslog-template-variables-where-to-find-them.html">`_.
+
+Message Properties
+------------------
+These are extracted by rsyslog parsers from the original message. All message
+properties start with a letter.
+
+The following message properties exist:
+
+**msg**
+ the MSG part of the message (aka "the message" ;))
+
+**rawmsg**
+ the message "as is". Should be useful for debugging and also if a message
+ should be forwarded totally unaltered.
+ Please notice *EscapecontrolCharactersOnReceive* is enabled by default, so
+ it may be different from what was received in the socket.
+
+**rawmsg-after-pri**
+ Almost the same as **rawmsg**, but the syslog PRI is removed.
+ If no PRI was present, **rawmsg-after-pri** is identical to
+ **rawmsg**. Note that the syslog PRI is header field that
+ contains information on syslog facility and severity. It is
+ enclosed in greater-than and less-than characters, e.g.
+ "<191>". This field is often not written to log files, but
+ usually needs to be present for the receiver to properly
+ classify the message. There are some rare cases where one
+ wants the raw message, but not the PRI. You can use this
+ property to obtain that. In general, you should know that you
+ need this format, otherwise stay away from the property.
+
+**hostname**
+ hostname from the message
+
+**source**
+ alias for HOSTNAME
+
+**fromhost**
+ hostname of the system the message was received from (in a relay chain,
+ this is the system immediately in front of us and not necessarily the
+ original sender). This is a DNS-resolved name, except if that is not
+ possible or DNS resolution has been disabled.
+
+**fromhost-ip**
+ The same as fromhost, but always as an IP address. Local inputs (like
+ imklog) use 127.0.0.1 in this property.
+
+**syslogtag**
+ TAG from the message
+
+**programname**
+ the "static" part of the tag, as defined by BSD syslogd. For example,
+ when TAG is "named[12345]", programname is "named".
+
+ Precisely, the programname is terminated by either (whichever occurs first):
+
+ - end of tag
+ - nonprintable character
+ - ':'
+ - '['
+ - '/'
+
+ The above definition has been taken from the FreeBSD syslogd sources.
+
+ Please note that some applications include slashes in the static part
+ of the tag, e.g. "app/foo[1234]". In this case, programname is "app".
+ If they store an absolute path name like in "/app/foo[1234]", programname
+ will become empty (""). If you need to actually store slashes as
+ part of the programname, you can use the global option
+
+ global(parser.permitSlashInProgramName="on")
+
+ to permit this. Then, a syslogtag of "/app/foo[1234]" will result in
+ programname being "/app/foo". Note: this option is available starting at
+ rsyslogd version 8.25.0.
+
+**pri**
+ PRI part of the message - undecoded (single value)
+
+**pri-text**
+ the PRI part of the message in a textual form with the numerical PRI
+ appended in brackets (e.g. "local0.err<133>")
+
+**iut**
+ the monitorware InfoUnitType - used when talking to a
+ `MonitorWare <https://www.monitorware.com>`_ backend (also for
+ `Adiscon LogAnalyzer <https://loganalyzer.adiscon.com/>`_)
+
+**syslogfacility**
+ the facility from the message - in numerical form
+
+**syslogfacility-text**
+ the facility from the message - in text form
+
+**syslogseverity**
+ severity from the message - in numerical form
+
+**syslogseverity-text**
+ severity from the message - in text form
+
+**syslogpriority**
+ an alias for syslogseverity - included for historical reasons (be
+ careful: it still is the severity, not PRI!)
+
+**syslogpriority-text**
+ an alias for syslogseverity-text
+
+**timegenerated**
+ timestamp when the message was RECEIVED. Always in high resolution
+
+**timereported**
+ timestamp from the message. Resolution depends on what was provided in
+ the message (in most cases, only seconds)
+
+**timestamp**
+ alias for timereported
+
+**protocol-version**
+ The contents of the PROTOCOL-VERSION field from IETF draft
+ draft-ietf-syslog-protocol
+
+**structured-data**
+ The contents of the STRUCTURED-DATA field from IETF draft
+ draft-ietf-syslog-protocol
+
+**app-name**
+ The contents of the APP-NAME field from IETF draft
+ draft-ietf-syslog-protocol
+
+**procid**
+ The contents of the PROCID field from IETF draft
+ draft-ietf-syslog-protocol
+
+**msgid**
+ The contents of the MSGID field from IETF draft
+ draft-ietf-syslog-protocol
+
+**inputname**
+ The name of the input module that generated the message (e.g.
+ "imuxsock", "imudp"). Note that not all modules necessarily provide this
+ property. If not provided, it is an empty string. Also note that the
+ input module may provide any value of its liking. Most importantly, it
+ is **not** necessarily the module input name. Internal sources can also
+ provide inputnames. Currently, "rsyslogd" is defined as inputname for
+ messages internally generated by rsyslogd, for example startup and
+ shutdown and error messages. This property is considered useful when
+ trying to filter messages based on where they originated - e.g. locally
+ generated messages ("rsyslogd", "imuxsock", "imklog") should go to a
+ different place than messages generated somewhere else.
+
+**uuid**
+
+ *Only Available if rsyslog is build with --enable-uuid*
+
+ A UUID for the message. It is not present by default, but will be created
+ on first read of the uuid property. Thereafter, in the local rsyslog
+ instance, it will always be the same value. This is also true if rsyslog
+ is restarted and messages stayed in an on-disk queue.
+
+ Note well: the UUID is **not** automatically transmitted to remote
+ syslog servers when forwarding. If that is needed, a special template
+ needs to be created that contains the uuid. Likewise, the receiver must
+ parse that UUID from that template.
+
+ The uuid property is most useful if you would like to track a single
+ message across multiple local destination. An example is messages being
+ written to a database as well as to local files.
+
+**jsonmesg**
+
+ *Available since rsyslog 8.3.0*
+
+ The whole message object as JSON representation. Note that the JSON
+ string will *not* include an LF and it will contain *all other message
+ properties* specified here as respective JSON containers. It also includes
+ all message variables in the "$!" subtree (this may be null if none are
+ present).
+
+ This property is primarily meant as an interface to other systems and
+ tools that want access to the full property set (namely external
+ plugins). Note that it contains the same data items potentially multiple
+ times. For example, parts of the syslog tag will by contained in the
+ rawmsg, syslogtag, and programname properties. As such, this property
+ has some additional overhead. Thus, it is suggested to be used only
+ when there is actual need for it.
+
+System Properties
+-----------------
+These properties are provided by the rsyslog core engine. They are **not**
+related to the message. All system properties start with a dollar-sign.
+
+Special care needs to be taken in regard to time-related system variables:
+
+* ``timereported`` contains the timestamp that is contained within the
+ message header. Ideally, it resembles the time when the message was
+ created at the original sender.
+ Depending on how long the message was in the relay chain, this
+ can be quite old.
+* ``timegenerated`` contains the timestamp when the message was received
+ by the local system. Here "received" actually means the point in time
+ when the message was handed over from the OS to rsyslog's reception
+ buffers, but before any actual processing takes place. This also means
+ a message is "received" before it is placed into any queue. Note that
+ depending on the input, some minimal processing like extraction of the
+ actual message content from the receive buffer can happen. If multiple
+ messages are received via the same receive buffer (a common scenario
+ for example with TCP-based syslog), they bear the same ``timegenerated``
+ stamp because they actually were received at the same time.
+* ``$now`` is **not** from the message. It is the system time when the
+ message is being **processed**. There is always a small difference
+ between ``timegenerated`` and ``$now`` because processing always
+ happens after reception. If the message is sitting inside a queue
+ on the local system, the time difference between the two can be some
+ seconds (e.g. due to a message burst and in-memory queueing) up to
+ several hours in extreme cases where a message is sitting inside a
+ disk queue (e.g. due to a database outage). The ``timereported``
+ property is usually older than ``timegenerated``, but may be totally
+ different due to differences in time and time zone configuration
+ between systems.
+
+The following system properties exist:
+
+**$bom**
+ The UTF-8 encoded Unicode byte-order mask (BOM). This may be useful in
+ templates for RFC5424 support, when the character set is know to be
+ Unicode.
+
+**$myhostname**
+ The name of the current host as it knows itself (probably useful for
+ filtering in a generic way)
+
+Time-Related System Properties
+..............................
+
+All of these system properties exist in a local time variant (e.g. \$now)
+and a variant that emits UTC (e.g. \$now-utc). The UTC variant is always
+available by appending "-utc". Note that within a single template, only
+the localtime or UTC variant should be used. While it is possible to mix
+both variants within a single template, it is **not** guaranteed that
+they will provide exactly the same time. The technical reason is that
+rsyslog needs to re-query system time when the variant is changed. Because
+of this, we strongly recommend not mixing both variants in the same
+template.
+
+Note that use in different templates will generate a consistent timestamp
+within each template. However, as $now always provides local system time
+at time of using it, time may advance and consequently different templates
+may have different time stamp. To avoid this, use *timegenerated* instead.
+
+**$now**
+ The current date stamp in the format YYYY-MM-DD
+
+**$year**
+ The current year (4-digit)
+
+**$month**
+ The current month (2-digit)
+
+**$day**
+ The current day of the month (2-digit)
+
+**$wday**
+ The current week day as defined by 'gmtime()'. 0=Sunday, ..., 6=Saturday
+
+**$hour**
+ The current hour in military (24 hour) time (2-digit)
+
+**$hhour**
+ The current half hour we are in. From minute 0 to 29, this is always 0
+ while from 30 to 59 it is always 1.
+
+**$qhour**
+ The current quarter hour we are in. Much like $HHOUR, but values range
+ from 0 to 3 (for the four quarter hours that are in each hour)
+
+**$minute**
+ The current minute (2-digit)
+
+**$now-unixtimestamp**
+ The current time as a unix timestamp (seconds since epoch). This actually
+ is a monotonically increasing counter and as such can also be used for any
+ other use cases that require such counters. This is an example of how
+ to use it for rate-limiting::
+
+ # Get Unix timestamp of current message
+ set $.tnow = $$now-unixtimestamp
+
+ # Rate limit info to 5 every 60 seconds
+ if ($!severity == 6 and $!facility == 17) then {
+ if (($.tnow - $/trate) > 60) then {
+ # 5 seconds window expired, allow more messages
+ set $/trate = $.tnow;
+ set $/ratecount = 0;
+ }
+ if ($/ratecount > 5) then {
+ # discard message
+ stop
+ } else {
+ set $/ratecount = $/ratecount + 1;
+ }
+ }
+
+ NOTE: by definition, there is no "UTC equivalent" of the
+ $now-unixtimestamp property.