rsyslog config中我们可以使用property replacer.一般格式如下。
%propname:fromChar:toChar:options%
在property replacer我们一般直接使用分隔符分割msg,抽取各个FIELD。
"%msg:F,44:3%"
F:抽取FIELD
44:分隔符的ASCII码 (例:逗号:44,双引号:34)
3:使用的FIELD的NUMBER。
如果上述无法满足要求我们可以使用正则表达式进行匹配和抽取想要的FIELD。
"%msg:R:.*Sev:. \(.*\) \[.*--end%"
带参数正则表达式:
可以在R后面加入参数,来抽取匹配到的FIELD。
R,<regexp-type>,<submatch>,<nomatch>,<match-number>
regexp-type: BRE or ERE
submatch: 匹配的result的子FIELD,0,1代表匹配到的整个字符串,2~9代表后面各个子串。
nomatch:代表匹配失败的时候,填充的默认值。"DFLT":NO MARCH, "BLANK":"" or "FIELD":整个msg
match-number:代表匹配结果有多个情况下,使用哪一个结果。0,1,。。。
%msg:R,ERE,1,FIELD:for (vlan[0-9]*):--end%
%msg:R,ERE,1,FIELD,1:for (vlan[0-9]*):--end%
实例解析一下,
LOG:
2022.12.07T20:04:58.000640+00:00, INFORMATION, UPLOAD, 3001,"Test succeeded for URL http://192.168.1.167"
对于上面的log,如果我们想抽取""中间的内容,可以使用如下表达式。
%msg:R,ERE,5,FIELD:(([a-zA-Z]*),\\s?([a-zA-Z]*),\\s?([0-9]*),\\s?(\".*))--end%
具体解析如下,
Property Replacer 详细可参考以下Blog。