Filter Conditions

选择器字段本身有两个部分组成,一个设备和一个优先级,

通过一个句号(".").


两部分都是不区分小写的,也可以指定为十进数,但是不要那么做,你会被警告。

facilities and priorities是在syslog(3)描述。


facility 是下面关键字中的一个:auth,authpriv, cron, daemon, kern, lpr, mail, mark, news, security (same as auth), syslog, user, uucp and

local 0 到local 7.


关键字security  不应该再被使用,标记为内部使用,因此不能被应用使用。


priority 是下面中的一个关键字,升序顺序:debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg, panic (same as emerg). 

关键字error,wrn和panic 是过时的,不再被使用。priority  定义消息的严重性


原始的BSD syslogd 行为是 特定的priority  或者更高的所有消息是记录根据给定的动作

除了额外的上面提到的理解下面的扩展:

一个asterisk ("*") 代表所有的 facilities or all priorities, 


取决于 它被用在哪里(句号之前或者之后).


keyword  none 表示用于没有给定的facility的优先级。

你可以指定多个facilities 使用相同的优先级模式在一个语句使用逗号,


多个selectors 可以指定用于一个单独的动作使用,分隔符。


基于属性的过滤器:


基于属性的过滤器是唯一的对于rsyslogd.

它们允许过滤任何property(属性), 像HOSTNAME,systag和msg.

所有的当前支持的属性的列表可以在属性替换文档中找到(但是记住只有属性,不是替换)


基于属性过滤器必须以一个:开始在第一个列,这个告诉rsyslog 它是一个新的filter 类型。


冒号必须跟着属性名字,一个逗号,比较表达式的名字来完成,另外的逗号,和然后比对的值。

这个值必须被引号引起。


可以是空格和tabs 在逗号之间。

属性名称和比较操作是区分大小写的,因此"msg"工作,当"MSG"是一个无效的属性名

:property, [!]compare-operation, "value"

Compare-Operations:

下面的比较操作当前是支持的:

contains:

检查 如果提供的字符串是包含在属性中, 必须有一个精确的匹配,不支持通配符。

isequal:


比较:


比较提供的值和属性的内容,那些两个值必须完全相等。

和contain不同的是contains 搜索值在属性值的任何地方,

而所有字符必须相等对于isequal.

因此,isequal 是最重要的用于字段像 syslogtag or FROMHOST,

在哪里你可能知道确切的内容。

startswith:

检查如果值是准确找到在属性值的开始, 例如,如果你搜索"val":


:msg, startswith, "val"


它会是一个匹配如果msg 包含"值是在这个消息",但是它不会匹配如果msg包含"有值在这个消息里"

(在后面的例子,"contain"会匹配)。注意"startwith" 是比正则表达式快的。

所以一旦实施,它会变的非常高性能 使用"startwith"


regex:

比较属性和提供的POSIX BRE正则表达式

你可以使用!在比较操作的前面, 这个操作的结果被否定。

例如,如果 msg contains  “This is an informative message” 下面例子不会匹配:


:msg, contains, "error"



但是这个会匹配:

:msg, !contains, "error"


使用~!可以是有用的如果你想要做一些特定的处理,

但是排除一些指定的事件。你可以使用discard action 


*.* /var/log/allmsgs-including-informational.log
:msg, contains, "informational"  ~
*.* /var/log/allmsgs-but-informational.log



Value Part  值部分:

值是引号字符串,它支持一些转义字符:

" 引号字符

\ 转义反斜杠

转义字符总是开始一个反斜杠,额外的转义可能被增加。

反斜杠字符必须是被转义

可能的,"msg" 是最突出的属性基于过滤器的使用例子。

它实际上是文本消息。

如果你想要基于一些消息内容过滤 ,可以这么搞

:msg, contains, "ID-4711"

过滤器 会匹配当消息包含字符串 “ID-4711”. 

请注意 比较是大小写敏感的,

因此它不会匹配如果 “id-4711”  会包含在消息里。


:msg, regex, "fatal .* error"


这个过滤器使用一个POSIX 恒泽表达式。它包含当字符串包含字符"fatal"和"error" 


和任何其他(比如: “fatal net error” and “fatal lib error” but not “fatal error”

因为两个空格是需要的通过正则表达式)


获取基于属性过滤器有时是具有挑战性的。

为了帮助你用最小的努力,rsyslogd 分割我们的debug信息用于所有基于属性的过滤器在它们的评估

表达型过滤器:

表达式基于过滤器允许过滤任何复杂的表达式,可以包含布尔运算,算术运算和字符串操作。

表达式过滤器会进化到一个完整的配置脚本语言。

不幸的是, 它们的语法会轻微的改变在那个过程中。

因此如果你使用它们,你需要准备改变你的配置文件。


表达式基于filter 是通过关键字if 表明,它们有这种格式:

if expr then action-part-of-selector-line

例子:

*.* /var/log/file1 # the traditional way
if $msg contains 'error' then /var/log/errlog # the expression-based way

现在,你需要指定数字的值如果想要检查facilities and severity.


那些可以找到在RFC 5424.

如果你不喜欢那个,你可以使用文本属性。

一定要确保使用正确的,随着表达式支持被增强,这个会改变。

比如,你想要过滤消息在有facility =local0,

以DEVNAME开始和有 error1或者error0 在消息内容里,你可以使用下面的过滤:
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and
 ($msg contains 'error1' or $msg contains 'error0') then /var/log/somelog

请注意上面的必须在一行! 如果你想要存储所有的消息除了那些包含n “error1” or “error0”, 你可以增加一个not:

if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and not ($msg contains 'error1' or $msg contains 'error0') then /var/log/somelog

原文地址:https://www.cnblogs.com/hzcya1995/p/13349673.html