Rsyslog提供了三种不同类型的过滤器。
a.基于 RainerScript的过滤器
RainerScript是一个专门设计用来处理网络事件的脚本语言,2008年起 Rsyslog开始支持 RainerScript。它主要通过逻辑、算术和字符串操作等表达式来过滤,最常用的关键字就是 if,示例如下。
if $programname == 'prog1' then { action(type="omfile" file="/var/log/prog1.log") if $msg contains 'test' then
action(type="omfile" file="/var/log/prog1test.log")
else
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and not ($msg contains_i 'error1' or $msg contains_i 'error0') then /var/log/ somelog
*.err /var/log/errlog }
如上所示,在 RainerScript类型的过滤器中,也可以写其他类型的过滤器。
b.基于程序位和严重性的选择器
selector是传统的 Syslog过滤方法,只能针对 PRI做出是非与的判断。参见上例中最后一条。
*.err /var/log/errlog
c.基于属性的过滤器属性过滤器是 Rsyslogd独有的,可以对各种属性进行过滤。属性过滤器的每行都以“:”(冒号)开头,然后紧跟属性名称和逗号,接着是比较操
作符和逗号,最后是用引号包裹的内容。注意属性是对大小写敏感的,示例如下。
*.* /var/log/allmsgs-including-informational.log :msg, contains, "informational" ~ *.* /var/log/allmsgs-but-informational.log
这里用“:msg”来过滤 msg中包含 informational字样的信息,后面的“~”则是 action操作,稍后讲述。
比较操作符包括有 contains、isempty、isequal、startswith、regex、ereregex,如果不区分大小写,则在操作符后加“_i”。
注意:这里的 regex,是指 POSIX BRE正则表达式,也即是 grep和 sed支持的正则表达式;而 ereregex是指 POSIX ERE正则表达式,是 egrep和 awk支持的正则表达式。
另,由于 CentOS上 grep、sed、vi和 awk等命令都是 GNU改版过的,在正则上更为丰富,比如“ +”、“?”以及“\1”(反引用)的支持等。所以习惯了 GNU命令的人可能会认为 Rsyslog中 regex的使用依然比较局限。