我需要对一些日志消息采取一些操作。例如,我想根据严重性将它们记录到不同的文件中。
如果我使用这个,一切都正常:
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 配置,第四行和第五行无效(因此再次,可能“什么都不做”)