我需要对一些日志消息采取一些措施。例如,我想根据严重性将它们记录到不同的文件中。
如果我使用这个,一切都很好:
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
}
根据过滤器和RanierScript的 rsyslog 文档,不支持多行 { .. } 语法。Rsyslog 的解析器通常不会给出错误,宁愿忽略问题或以您不希望的方式解释它们。您的“性感”示例可能正在执行
{
与“myprog”匹配的事件的操作(我找不到这样的操作,所以我怀疑这意味着“什么都不做”)。第二行和第三行被视为传统风格的 syslog 配置,第四行和第五行是无效的(同样,可能“什么都不做”)您的行仅包含 '~' 是错误的。它应该是“*.* ~”。
我知道你主要使用 Debian stable。您的 rsyslog 版本是 5.xy,不接受 RanierScript。
您可以更新到 backports 版本(当前为 7.6.3),然后您的第二个示例应该可以工作。