Filter Conditions
rsyslog 提供四种不同的“Filter conditions”1. 传统的基于severity 和 facility的Selectors
2. 基于property的过滤器
3. 基于表达的过滤器
4. BSD格式块(不向上兼容)
Selectors(选择器)
选择器是传统的过滤syslog的方式。选择器是过滤系统日志消息的传统方式。 它们一直保存在rsyslog中,它们保存syslog原始的格式,因为众所周知的,高效的,并且也需要与stock syslogd配置文件兼容。如果你只需要根据priority和facility进行过滤,你应该选择这种方式,因为用它可以写最少的代码。在v7版本之前,selector行比advanced格式更具效率,但是现在不在存在这种问题。
selector字段由两个部分组成,facility和priority,他们用'.'号分隔。在syslog(3)中有他们的描述。
facility的取值可以有auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, syslog, user, uucp and local0 through local7.它用来特指产生消息的子系统。
priority的取值可以有debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg, panic (same as emerg). 它定义了消息的重要程度。
在selector格式中,如果指定了消息等级,会返回该等级及以上的消息等级。除此之外,‘*’表示所有的facility类型或者所有的priority类型。‘none’表示不传递这个facility的信息。你也可以用‘,’指定相同等级的多个facility。
多个selector之间可以用‘;’分隔。selector字段中的每一个selector都有覆盖前面的能力,使用这一特性可以有效的排除你不想要的设备消息。你也可以用‘=’指定某个优先级。也可用‘!’忽略某个优先级。
Property-Based Filters
基于属性的过滤器对于rsyslogd是唯一的。 它们允许过滤任何属性,如HOSTNAME,syslogtag和msg。 rsyslog属性文档中可以找到所有当前支持的属性列表。 使用此过滤器,可以使用指定的比较操作,针对指定的值检查每个属性。基于属性的过滤器必须以列1中的冒号开头。这告诉rsyslogd它是新的过滤器类型。 冒号后面必须跟着属性名称,逗号,要执行的比较操作的名称,另一个逗号以及要比较的值。 这个值必须被引用。 逗号之间可以有空格和制表符。 属性名称和比较操作区分大小写,因此“msg”起作用,而“MSG”是无效的属性名称。 简言之,语法如下:
:属性,[!]比较操作,“值”(:property, [!]compare-operation, "value")
Compare-Operations
比较操作支持下列内容:contains :检查是不是包含属性,只支持精准匹配。
isequal:检查值是否相等
startswith: 检查信息的开头是不是某属性值(:msg, startswith, "val")
regex: 将值与属性进行比较
ereregex: 将该属性与提供的POSIX ERE正则表达式进行比较。
您可以立即在比较操作前使用bang-character(!),否则此操作的结果将被取消。 例如,如果msg包含“This is an informative message”,则下面的示例不匹配:
:msg, contains, "error"
但是下面是成功的:
:msg, !contains, "error"
如果您想要进行一些通用处理但排除某些特定事件,则使用否定可能很有用。 您可以结合使用丢弃操作。 如下:
不要忽视第2行的代字符! 在本示例中,所有消息都写入文件allmsgs-including-informational.log。 然后,包含字符串“信息”的所有消息都将被丢弃。 这意味着“丢弃线”(我们示例中的编号2)下方的配置文件行将不会应用于此消息。 然后,所有其余的行也将写入文件allmsgs-but-informational.log。
Value Part
值是一个带引号的字符串。 它支持一些转义序列:“ - 引号字符(例如”带有“引号”的字符串“)
\ - 反斜线字符(例如“C:\ tmp”)
转义序列总是以反斜杠开始。 未来可能会添加其他转义序列。 反斜线字符必须转义。 然后,上面列出的任何其他序列都是无效的,并可能导致不可预知的结果。
可能“msg”是基于property的过滤器最突出的用例。 这是实际的消息文本。 如果您想根据某些消息内容(例如特定代码的存在)进行过滤,则可以通过以下方式轻松完成此操作:
:msg, contains, "ID-4711"
当消息包含字符串“ID-4711”时,此过滤器将匹配。 请注意,比较是区分大小写的,所以如果消息中包含“id-4711”,它将不匹配。
:msg, regex, "fatal .* error"
此过滤器使用POSIX正则表达式。 当字符串包含“fatal”和“error”之间的任何内容时(’fatal net error”和“fatal lib error”,但不包含“fatal error”)。
Expression-Based Filters
基于表达的过滤器允许过滤任意复杂的表达式,他可以包含boolean, 数学符号和其他的string操作,expression过滤器将演变为完整的配置脚本语言。不幸的是,他们的语法在这个过程中会稍微改变。 所以如果你现在使用它们,你需要准备好一段时间后更改你的配置文件。基于expression的过滤器在新行的第1列中用关键字“if”表示。 他们有这样的格式:、
如果“和”那么“是可能存在的固定关键字。 “expr”是一个(可能相当复杂的)表达式。 所以表达文件的细节。 “action-part-of-selector-line”是一个动作,就像你所知道的那样(例如写入该文件的“/ var / log / logfile”)。
Expressions
该语言支持任意复杂的表达式。 所有常用的操作员都受支持 操作的优先顺序如下(列表中较低的操作在列表中较高,例如在添加之前完成乘法。- expressions in parenthesis(括号中的表达式)
- not, unary minus(not, 一元减号)
- *, /, % (modulus, as in C)
- +, -, & (string concatenation)
- ==, !=, <>, <, >, <=, >=, contains (strings!), startswith (strings!)
- and
- or
BSD-style Blocks
v7以上不再支持,推荐不要使用
Examples
现在,如果您想检查facility和severity,则需要指定数值。 这些可以在RFC 5424中找到。如果你不喜欢这样,你当然也可以使用文本属性 - 只要确保使用正确的。 随着表达支持的增强,这将会改变。 例如,如果要过滤具有设备local0的消息,请以“DEVNAME”开头,并在消息内容中包含“error1”或“error0”,您可以使用以下过滤器:
请注意,以上所有内容必须在一行中! 如果你想存储除了那些包含“error1”或“error0”的消息,你只需要添加一个“not”:
如果您希望进行不区分大小写的比较,请使用“contains_i”而不是“contains”和“startswith_i”而不是“startswith”。 请注意,基于表达式的过滤器目前不支持正则表达式。 当函数支持被添加到表达式引擎时,这些将被添加(原因是正则表达式将是一个单独的可加载模块,在它可以被实现之前需要更多的前提条件)。
没有评论:
发表评论