severity and facility
Facility 定义日志消息的来源,以方便对日志进行分类,facility 有以下几种:
--kern 内核消息
--user 用户级消息
--mail 邮件系统消息
--daemon 系统服务消息
--auth 认证系统消息
--syslog 日志系统自身消息
--lpr 打印系统消息
Priority/Severity Level
除了日志来源以外,对于同一来源产生的日志消息,还进行了优先级划分,
优先级氛围以下几种:
--Emergency 系统已经不可用
--Alert 必须立即进行处理
--Critical 严重错误
--Error 错误
--Warning 警告
--Notice 正常信息,但是较为重要
--Infomatinal 正常信息
Filter Conditions 过滤条件:
Rsyslogs 提供4种不同的 过滤条件:
“传统”的严重性和设备基于选择器
基于属性的过滤器
基于表达式的过滤器
基于BSD blocks块的
选择器:
选择器是传统的过滤syslog消息的方式。 它们使用它们原来的语法 一直保存在rsyslog里,
因为它是总所周知的,高效的和 需要用于兼容stock syslogd 配置文件。
如果你只是需要过滤基于优先级和设备,你应该这样做使用 selector lines.
它们不是2等公民在rsyslog里,提供了最好的性能对于job.
选择器字段本身有两部分组成,一个设备和一个优先级,通过一个.分隔。
这两个部分都是不区分大小写,也可以指定为一个10进制数,但是不好这样做,
你会被警告。设备和优先级都是在syslog(3)描述的。
下面提到的名字对应于类似LOG_-values 是在 /usr/include/syslog.h.
facility 是下面关键字之一:
authpriv, cron, daemon, kern, lpr, mail, mark, news, security (same as auth), syslog, user, uucp and local0 through local7.
关键字 security 不应该用于人任何其他和标记只能内部使用,因此不能被用于应用。
无论如何,你需要指定和重定向这些消息。
facility 指定了子系统 会产生消息,例如 所有的mail 程序的log 使用 facility (LOG_MAIL) 如果它们记录日志使用syslog
优先级是 下面的关键词之一:
debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg, panic (same as emerg).
关键词error, warn和panic 是过时的,不能再被使用,优先级定义了 消息的安全
原始的BSD syslogd 行为是所有特定的优先级的消息和更高的是被记录根据给定的action.
Rsyslogd 行为相同,但是有一些扩展。
除了以上提到的名字 rsyslogd(8) 理解下面的扩展:
一个星号 ("*") 代表所有的facilities或者所有的优先级,
取决于它使用在哪里。
关键字none 表示给定的facility没有优先级。
你可以指定多个facilities 使用相同的邮件及模式 在一个语句里使用,分隔。
你可以指定 多个facilities
记住只有facility 部分,优先级部分会被跳过
多个选择器可以通过一个acion被指定使用 (";")分隔。
记住每个selector 字段是能够覆盖前面的。使用这个行为你可以排除一些优先级
Rsyslogd 有一个语法扩展到原始的BSD 源, 让其使用更加直观。
你可以优先于米格优先级 使用一个("=") 到特定的单个优先级。
你也可以(两个都是有效的)优先于优先级使用一个感叹号(!) 来忽略所有的优先级,
无论是确切这个或者任何更好的优先级。
如果你使用两个表达式相比感叹号
基于属性的过滤器:
syslog local5 nginx-zjzc01;
基于属性的过滤器是唯一的对于rsyslogd,它允许规律在任何属性, 像主机名,syslogtag和msg
所有的当前支持的属性的列表可以被找到在属性替换文档(但是记住,只有属性,没有替换是支持的)
在这个过滤器,每个属性可以被检查通过一个指定的值, 使用一个指定的比较操作符。
基于属性的过滤器必须以一列开始 在column 0,这个高速rsyslogd 它是一个新的过滤器类型。
列必须跟着属性的名字, 一个逗号, 比较操作符的名字来进行,另外一个逗号和对值进行比较。
这个值必须被引号引起来, 可以有空格和tabs 在逗号之间.
属性的名字和比较操作符是区分大小写的,因此 "msg"工作,当"MSG"不是一个正确的属性名字。简单的说,语法如下:
:property, [!]compare-operation, "value"
比较操作:
下面的比较操作符当前是支持的:
contains:
检查如果提供的字符串在是是包含,这个必须是一个准确的匹配,不支持通配符
isequal 相等:
提供的值和属性内容比较, 这两个值必须完全等价匹配。
不同包含是contains 搜索值在属性值里的任何地方,然而 所有的分字符串必须是相同的对于isequal
因此 isequal 对于字段像syslogtag 或者FROMHOST是有用的,在那里你知道确切的内容。
startswith: 从开始
检查是否值是被准确找到在属性值的开始,比如 如果你搜索"val" :
:msg, startswith, "val"
它是一个匹配如果msg 包含 “values are in this message”
但是它不会匹配 如果 msg 是 “There are values in this message" (这种情况,“contains” would match).
注意 “startswith”到目前为止最快的相比正则表达式。
因此 一旦它们被实施,它可以非常有意思(性能) 来使用 “startswith”.
regex:
比较 属性提供正则表达式
ereregex
你可以使用 "!" 在比较操作符的前面, 这个操作的结果是否定的。比如, 如果msg 包含 “This is an informative message”,
下面的例子不会匹配
! 表示否定
:msg, contains, "error"
but this one matches:
:msg, !contains, "error"
使用否定可能是有用的 如果你想做一些通用的处理,但是排除一些特定的值。
你可以使用discard action 连接,例子将是:
*.* /var/log/allmsgs-including-informational.log
:msg, contains, "informational" ~
*.* /var/log/allmsgs-but-informational.log
不要忽略波浪线在第2行,在这个例子,所有的消息是写入到文件 allmsgs-including-informational.log.
然后,所有的消息包含 字符串 “informational” 会被丢弃。
这意味着 配置文件 行 在 “discard line” (在第2行在我们的例子)不会英语这个消息
然后,所有剩下的行会写入到文件 allmsgs-but-informational.log.
值的一部分:
值是一个引号引起来的字符串,它支持一些转义序列:
" 引号字符(例如 “String with ”Quotes””)
\ 反斜杠字符 (e.g. “C:\tmp”) 正常 C:app
转义字符总是以一个开始,二外的转义字符 可能被增加。
反斜杠字符必须被转义。
可能的,"msg" 是最突出使用的情况 在属性基于过滤器,它是实际的消息文本,如果 你想要规律基于一些消息内容
(例子: 特定代码的存在)的基础上,这个可以简单的实现:
:msg, contains, "ID-4711"
这个过滤器匹配当消息包含字符串 “ID-4711”.
过滤器必须匹配当消息包含 字符串 “ID-4711”. 请注意 比较是区分大小写的,
所以 它不会匹配如果 “id-4711” 会包含在消息内
:msg, regex, "fatal .* error"
这个过滤器使用一个POSIX 正则表达式,它匹配当字符串包含字符“fatal” and “error” 和任何其他在它们之间
(比如 “fatal net error” and “fatal lib error” but not “fatal error” )
获得基于属性的过滤器可能有时候是具有挑战的,
为了帮助你尽可能小的努力,rsyslogs 分隔debug信息对于所有基于属性的过滤器 在它们的评估阶段。
为了启用它,运行rsyslogd 在前台指定-d 选项
基于表达式的过滤器:
基于表达式过滤器允许过滤 在任意复杂的表达式,可以包含布尔运算,算术运算和字符串操作。
表达式过滤会变成一个完整配置脚本语言。
不幸的是,它们的语法会轻微的变化在这个过程中。
因此如果你现在使用它们,你需要准备改变你的配置文件 。然而, 我们尝试实现脚本facility 尽可能的
基于表达式的过滤器通过关键字if ,它们有这种格式:
if expr then action-part-of-selector-line
if和then 是固定的关键字,必须是存在的。"expr" 是一个表达式,
因此表达式文档的细节
“action-part-of-selector-line” 是一个action,就像你知道的(例如 “/var/log/logfile”来写整个文件)
*.* /var/log/file1 # the traditional way
if $msg contains 'error' then /var/log/errlog # the expression-based way
BSD 风格Blocks:
注意:rsyslog v7+ 不再支持BSD-风格的blocks 由于技术原因,因此 强烈不推荐使用它们
Examples 例子:
*.* /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, start with “DEVNAME” and have either “error1” or “error0”
在消息内容里,你可以使用下面的过滤器:
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and ($msg contains 'error1' or $msg contains 'error0') then
/var/log/somelog
请注意,上面的必须在一行上! 如果你想要存储所有的信息除了那些包含"err01"和"err02",你只要加上一个 not
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and not ($msg contains 'error1' or $msg contains 'error0') then
/var/log/somelog