rsyslog 配置语法

rsyslog 配置语法

我需要对一些日志消息采取一些操作。例如,我想根据严重性将它们记录到不同的文件中。

如果我使用这个,一切都正常:

if $programname == 'myprog'                                       then -/var/log/myprog.log
if $programname == 'myprog' and $syslogseverity-text >= 'warning' then -/var/log/myprog-alert.log
if $programname == 'myprog' ~

此日志将“myprog”发出的所有消息记录到 /var/log/myprog.log
此日志仅将“myprog”发出的警告和错误消息记录到 -/var/log/myprog-alert.log
然后停止处理(感谢“~”)

我喜欢更性感的东西:

if $programname == 'myprog' then {
    *.*         -/var/log/myprog.log
    *.warning   -/var/log/myprog-alert.log
    ~
}

但是,后一种构造虽然被 rsyslog 接受,但不会针对程序名进行过滤。
例如,每条消息都会写入 /var/log/myprog.log,无论消息来自哪个进程。

谁能解释一下我的错误或误解在哪里?

最终方法,来自以下答案:

使用“现代” rsyslogd。版本 > 7.xy
使用以下语法:

if $programname == 'myprog' then {
    *.warning   -/var/log/myprog-alert.log
    *.*         -/var/log/myprog.log
    *.*         stop
}

或者这个:

if $programname == 'myprog' then {
    *.warning   -/var/log/myprog-alert.log
                -/var/log/myprog.log
                stop
}

答案1

仅包含“~”的行是错误的。应该是“*.* ~”。

我知道您主要使用 Debian 稳定版。您的 rsyslog 版本是 5.xy,不接受 RanierScript。
您可以更新到反向移植版本(目前为 7.6.3),然后您的第二个示例应该可以正常工作。

答案2

rsyslog 过滤器文档雷尼尔脚本,不支持多行 { .. } 语法。Rsyslog 的解析器通常不会给出错误,而是倾向于忽略问题或以您不想要的方式解释它们。您的“更性感”示例可能是对与{“myprog”匹配的事件执行操作(我找不到这样的操作,所以我怀疑这意味着“什么都不做”)。第二行和第三行被视为传统风格的 syslog 配置,第四行和第五行无效(因此再次,可能“什么都不做”)

相关内容