带有模板的 Rsyslog 8 dynafile

带有模板的 Rsyslog 8 dynafile

我正在尝试设置 rsyslog 以使用模板 RSYSLOG_TraditionalFileFormat 作为默认操作模板,但对于某些特定消息,我需要使用另一个模板。在这两种情况下,我都需要 dynaFile。

我正在尝试通过以下方式实现这一目标:

#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

$template dynatemplate, "/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
$template dynatemplate2, "/var/log/%HOSTNAME%/%hostname%_%fromhost-ip%_%syslogtag%.log"

:msg, contains, "sometext" ?dynatemplate2;RSYSLOG_SyslogProtocol23Format
& ~

*.* ?dynatemplate

上述方法是否正确?

另外,由于我正在使用 rsyslog 8.24,如何使用表达式语法来完成?

答案1

我觉得还行。这是 RainerScript 版本,未经测试。我认为最后一个action()不需要*.*在前面加一个,因为这是默认的,但如果没有匹配项,请添加它。

template(name="dynatemplate" type="string" 
  string="/var/log/%HOSTNAME%/%PROGRAMNAME%.log")
template(name="dynatemplate2" type="string"
  string="/var/log/%HOSTNAME%/%hostname%_%fromhost-ip%_%syslogtag%.log")

if ($msg contains "sometext") then {
  action(type="omfile" dynaFile="dynatemplate2" template="RSYSLOG_SyslogProtocol23Format")
  stop
}
action(type="omfile" dynaFile="dynatemplate")

答案2

这对我来说很有效。我们使用 dynaFiles 来处理基于主机名的文件。
我需要删除时间戳和主机名,以免它们成为已采用 JSON 格式的事件的前缀。

template (name="LOG_TYPE_PATH" type="string"
  string="/path/to/your/logs/LOG_TYPE/%HOSTNAME%.log")

template(name="noTimestamp" type="list") {
    property(name="syslogtag")
    property(name="msg" spifno1stsp="on" )
    property(name="msg" droplastlf="on" )
    constant(value="\n")
    }

if ($hostname contains "10.0.0.17") then {
  action(type="omfile" dynaFile="LOG_TYPE_PATH" template="noTimestamp")
}

该文档很有帮助:

https://www.rsyslog.com/doc/v8-stable/configuration/templates.html

相关内容