选择器字段本身有两个部分组成,一个设备和一个优先级,
通过一个句号(".").
两部分都是不区分小写的,也可以指定为十进数,但是不要那么做,你会被警告。
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