Rsyslog中的数据项被称为“属性”,有消息属性、系统属性等。每当你要访问数据项时,都需要访问相应的属性。属性主要应用在模板和条件语句中,并且是大小写不敏感的(在3.17.0版本之前是大小写敏感的)。
1.Message Properties(消息属性)
消息属性是由rsyslog解释器从原始的消息中提取出来的,所有的消息属性都以字母开头,主要有如下消息属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
msg syslog协议的message部分 rawmsg rawmsg-after-pri hostname message的主机名 source hostname的别名 fromhost fromhost-ip syslogtag message的TAG programname 产生message的进程名 pri pri的值 pri-text pri值的文字表示 iut syslogfacility facility的值 syslogfacility-text facility值的文字表示 syslogseverity severity的值 syslogseverity-text severity值的文字表示 syslogpriority syslogseverity别名 syslogpriority-text syslogseverity-test别名 timegenerated 接收到消息的时间戳 timereported 上报消息的时间戳 timestamp timereporterd的别名 protocol-version structured-data app-name procid msgid inputname |
详见:http://www.rsyslog.com/doc/v8-stable/configuration/properties.html
2.System Properties(系统属性)
系统属性是由rsyslog核心引擎提供的,不同于消息属性,系统属性都是以$开头的。系统属性主要有:
1 2 3 4 5 6 7 8 9 10 |
$now 当前系统时间,YYYY-MM-DD $year 当前年份 $month 当前月份 $day 当前月份的day $hour $hhour $qhour $minute $bom $myhostname |
详见:http://www.rsyslog.com/doc/v8-stable/configuration/properties.html
3.Property Replacer(属性替换器)
属性替换器是字符串类型模板的核心组件,一条syslog消息包含了许多已经定义了的属性。通过属性替换器,每个属性都可以被访问及修改,使用属性替换器,你可以轻松的使用属性值的一部分数据或修改后的数据。比如,你可以将属性值对应的所有字符改变为小写字母。
(1)访问属性
rsyslog的消息属性是在模板中使用的,你可以通过两个%来访问它们,或者使用属性替换器来修改它们。语法如下:
1 |
%property:fromChar:toChar:options% |
1)字符位置
fromChar和toChar是用来创建子串的。偏移是从1开始计算的,所以如果你想要获取msg属性值中的前两个字符,你可以这样使用:
1 |
%msg:1:2% |
又如果你不想指定开始和结束位置,但是想要指定选项,比如将msg转换为小写,那么你应该连续使用三个冒号:
1 |
%msg:::lowercase% |
又如果你想要从字符串中的某个位置开始提取到字符串尾部的子串,你可以使用$符号,那么你应该这样使用:
1 |
%msg:10:$% |
2)正则表达式
此外,属性替换器还支持正则表达式。一般方法是:使用R取代fromChar,告诉替换器使用正则表达式而不是基于位置的方法来提取子串;正则表达式部分放在toChar的位置,并且以—end结束。有如下示例:
1 |
%msg:R:.*Sev:.\(.*\)\[.*--end% |
并且,在R的后面还可以指定一些参数,用逗号分隔,如下所示:
1 |
R,<regexp-type>,<submatch>,<nomatch>,<match-number> |
其中,regexp-type指定正则表达式的类型:BRE(默认值)或ERE;
详见:http://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
3)分隔符
不仅如此,提取子串还可以基于“字段”来进行。若这样做的话,你需要使用F取代fromChar,用来指定分隔符,默认的分隔符是TAB(us-asscii对应的值是9)。你也可以自己指定分隔符,比如使用逗号,(asscii码是44)作为分隔符,在fromChar中相应的修改为F,44。如果你的syslog数据是由分隔符分隔的,那么这种方法要比正则表达式提取子串快的多。
字段号是从1开始的,即第一块被分隔下来的子串代号为1。字段号要被放在toChar中。比如,提取3号字段的内容(默认以TAB分隔):
1 |
%msg:F:3% |
如果以分号:分隔的话:
1 |
%msg:F,59:3% |
遗憾的是,对于获取到的分隔字段,不能再进一步的提取子串。为了解决这个问题,rsyslog v6.3.9版本之后,可以为分隔字段指定开始fromPos和结束toPos位置了。然而,语法相当难看,但是它是为了将这个功能集成到已经存在的语法系统中的唯一方法了。比如,我们想要从第3个字段中提取位置5到9的子串,你应该这样写:
1 |
%msg:F,59,5:3,9% |
其他未介绍到的内容详见:http://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
(2)Property Options(属性选项)
属性选项是大小写敏感的,目前有如下选项:
1 2 3 4 5 6 7 8 9 10 11 12 |
uppercase 将属性值转换为大写 lowercase 转换为小写 fixed-width 改变toChar的行为,以便它在原字符串更短的情况下,将原字符串填充到toChar的值,rsyslog v8.13.0才提供的功能 json 对值进行编码,以便它可以在JSON字段中使用。这意味着有几个字符要被转义,例如LF将被\n取代。 Jsonf[:outname] 这意味着该属性应该被表示为一个JSON字段。(rsyslog v6.3.9版本之后) csv 按照4180中指定的CSV格式格式化结果字段。比如:$template csvline,"%syslogtag:::csv%,%msg:::csv%" 该特性是在rsyslog v4.1.6版本引入的。 drop-last-lf 消息中的最后一个LF(换行,如果有的话)被删除。 date-utc 在输出之前将数据转换为UTC日期格式(rsyslog v8.18.0开始支持) date-mysql 格式化为mysql日期格式 date-rfc3164 格式化为RFC 3164的日期格式 …… sp-if-no-1st-sp 这个选项看起来很可怕,或许不应该被用户使用。这个选项是解决RFC3164中某个问题的一种方法。了解一下即可。 |
详情可见:http://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
4.其他
至此,rsyslog的主要特性已经介绍完了。对于其他为涉及的特性,可参见rsyslog的官方文档。后面有空的话,将会记录一些rsyslog消息日志入库的实践内容。