Rsyslog Properties and the Property Replacer
rsyslog Properties
数据项在rsyslog称为"属性",每当你想要访问数据项,你需要访问resprective属性。
Properties被用于:
templates(模板)
conditional statements(条件控制语句)
Message Properties
这些都是通过rsyslog解析器从原始消息中提取,所有消息属性从一个字母开始:
msg:message的MSG部分
rawmsg:从socket接收到的原始信息,一般用于debug。
hostname:message中的主机名
source:HOSTNAME的别名
fromhost:接受message的系统主机名,在多级收集的模式下不一定是原始的发送者的主机名,这是DNS解析的名称。
fromhost-ip:和fromhost一样,总是表现为一个IP地址,本地作为input的话,地址为127.0.0.1。
syslogtag:message的TAG部分
programname:tag的static部分,named[12345]的programname是named。
pri:message的PRI部分,未编码的。
pri-text:PRI的一部分,以文本的形式。
iut:略
syslogfacility:message的facility,以数字的形式
syslogfacility-text:message的facility,以文本的形式
syslogseverity:message的severity,以数字的形式
syslogseverity-text:message的severity,以文本的形式
syslogpriority:syslogseverity的别名
syslogpriority-text:syslogseverity-text的别名
timegenerated:接受到message是的timestamp,精度高
timereported:从message里面获取timestamp,时间进度取决于message本身
timestamp:timereported的别名
protocol-version:draft-ietf-syslog-protcol中的PROTCOL-VERSION字段
structured-data:draft-ietf-syslog-protocol中的STRUCTURED-DATA
app-name:draft draft-ietf-syslog-protocol中的APP-NAME字段
procid:draft-ietf-syslog-protocol中的PROCID字段
msgid:draft-ietf-syslog-protocol中的MSGID字段
inputname:生成的信息中输入模块的名字,并不是所有模块都提供这个属性。
System Properties
这些属性由rsyslog核心引擎提供。 它们与消息无关。 所有系统属性都以$开始。
例如timereported就包含message的时间戳信息,由于日志在中继的过程中可能时间戳比较滞后,使用$now表示的是系统当前处理的时间
$bom:utf-8编码的Unicode字节顺序,前提是知道是unicode字符集。
$now:当前的时间戳,YYYY-MM-DD
$year:当前时间的年份,4位数。
$month:当前的月份,2位数。
$day:当前的日,2位数。
$hour:当前的小时,2位数,24小时制。
$hhour:半小时制。
$qhour:略
$minute:当前时间的分钟数
$myhostname:当前主机的名称
The Property Replacer
property replacer是字符串模块的核心组件,syslog消息有很多明确的属性,每一个属性都可以被Property Replacer访问和操纵。例如将所有字符转换成小写。
Accessing Properties
syslog消息的属性被用于模板的内部,通过百分号访问,属性可以由替代属性修改。示例:
%property:fromChar:toChar:options%
Available Properties
参考上一节的rsyslog Properties部分
Character Positions
FromChar and toChar被用于建立子串,示例:
%msg:1:2%:截取前两个字符
%msg:::lowercase:::表示整个字符串,将全部字符串转换成小写
%msg:10:$%:$表示结尾,第10个字符一直到结尾。
支持正则匹配的方式:
%msg:R:.*Sev:. \(.*\) \[.*–end%:R表示正则匹配,–end表示结尾。
R后面可以指定参数,格式:
R,<regexp-type>,<submatch>,<nomatch>,<match-number>
regexp-type:正则表达式的类型,默认是BRE
submatch:子匹配标识要与结果一起使用的子匹配,0标志完整匹配,可以使用0-9.
match-number:表示匹配的模数,引用前面的匹配对象
nomatch:指定在找不到匹配的情况下应该使用的内容。
示例:
%msg:R,ERE,1,FIELD:for (vlan[0-9]\*):--end%
%msg:R,ERE,1,FIELD,1:for (vlan[0-9]\*):--end%
提取也可以基于字段来完成,放入一个F之后,再定义分隔符,分隔符使用字符的ascii码字符来表示
%msg:F,59:3% #59为分号
基于子串来做字段提取工作(6.3.9版本以后)
%msg:F,59,5:3,9% #F表示提取模式,59表示分隔符,5表示起始,3表示字段3,9表示提取的字符串位置
需要使用多个分隔符可以用+号,示例:
int n, m;
...
syslog(LOG_ERR, "%d test %6d", n, m); #使用空格作为分隔符,在遇到多个空格的情况下容易出现不唯一的情况
"%msg:F,32:2%" to "%msg:F,32+:2%" #使用+号来添加一个或多个相同分隔符的效果,来源与perl的风格
Property Options
属性选项是不区分大小写的。目前,定义以下选项:
uppercase:将属性转换成小写
lowercase:将属性文本转换成大写
csv:生成的格式
drop-last-lf:删除消息后面的换行符
date-mysql:mysql的时间格式
date-rfc3164:rfc3164的时间格式
date-rfc3164-buggyday:类似于date-rfc3164
date-rfc3339:rfc3339的时间格式
date-subseconds:时间戳的秒数
escape-cc:替换控制字符
space-cc:用空格替换控制字符
drop-cc:删除控制字符
sp-if-no-1st-sp:略
secpath-drop:去掉斜杠,e.g. "a/b" becomes "ab"
secpath-replace:将斜杠替换,e.g. "a/b" becomes "a_b"