我需要对某些日志消息采取几个操作。 例如,我想根据严重性将它们logging到不同的文件。
一切都好,如果我使用这个:
if $programname == 'myprog' then -/var/log/myprog.log if $programname == 'myprog' and $syslogseverity-text >= 'warning' then -/var/log/myprog-alert.log if $programname == 'myprog' ~
这个日志logging每个由'myprog'发送到/var/log/myprog.log的消息
这个只logging日志的警告和'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 }
只包含“〜”的行是错误的。 应该是“*。*〜”。
我知道你大多使用Debian stable。 你的rsyslog版本是5.xy,不接受RanierScript。
你可以更新到backports版本(目前7.6.3),然后你的第二个例子应该工作。
根据filter和RanierScript的rsyslog 文档,不支持多行{..}语法。 Rsyslog的parsing器通常不会给出错误,宁愿忽略问题或以您不打算的方式解释它们。 你的“更性感”的例子可能是执行匹配“myprog”的事件(我找不到这样的行为,所以我怀疑这意味着什么都不做)。 第二行和第三行被视为传统风格的系统日志configuration,第四和第五行是无效的(所以再次,可能“什么都不做”)