fluentdpm模型如何设置(正则表达式详解)
fluentdpm模型如何设置(正则表达式详解)正则表达式代码间的空格,是有匹配规则才存在的。不要忽视空格的存在。注意:日志原文:[logouting][success]1111 from IP 10.10.10.10: Logging out successfully!为了对正则表达式有个直观的认识,我将先把解析日志的正则表达式写出,然后再逐步拆解,解释每个部分的作用:# 解析日志的正则表达式 (?<log_type>(?<=\[)[^\]] )\S\S(?<protocol>[^\]]*)\S(?<username>[^ ]*) (from IP )(?<from_ip>[^:]*)\S (?<info>.*)$正则表达式说明:
在使用了半个月clickhouse日志平台后,数据量目前已突破1亿,在使用过程中,笔者梳理了几个日志平台的技术点,特此记录,分享。
首当其冲的莫过于正则表达式的学习和使用。笔者开始接触Fluentd时,也曾被吓到,感觉很难很复杂,后面,经过深度摸索、学习后,最终还是将fluentd的正则表达式拿下。
下面,笔者将通过一个例子详细介绍,Fluentd正则表达式探索历程。
example
日志原文:
[logouting][success]1111 from IP 10.10.10.10: Logging out successfully!
为了对正则表达式有个直观的认识,我将先把解析日志的正则表达式写出,然后再逐步拆解,解释每个部分的作用:
# 解析日志的正则表达式
(?<log_type>(?<=\[)[^\]] )\S\S(?<protocol>[^\]]*)\S(?<username>[^ ]*) (from IP )(?<from_ip>[^:]*)\S (?<info>.*)$
正则表达式说明:
注意:
正则表达式代码间的空格,是有匹配规则才存在的。不要忽视空格的存在。
上面的正则表达式,仔细观察后,可以发现其中的规律:
(?<log_type>(?<=\[)[^\]] )
(?<protocol>[^\]]*)
....
- 以 (?<custom-field-name> 开头,以 ) 结尾,表示:截取日志中,以custom-field-name(自定义字段名)为名称的日志数据。
- 在 (?<custom-field-name> 后,在 ) 前的正则表达式,表示:定义截取日志数据的规则。
(?<log_type>(?<=\[)[^\]] ) 对应截取的是日志数据中:[logouting] 数据。其中:
- (?<log_type>.....) 表示:自定义一个字段,字段名称为 log_type。
- (?<=\[) 表示:从 [ 字符后,开始匹配,不包括 [ 字符。
- [^\]] 表示:贪婪匹配到 ] 字符,但不包括 ] 字符。
该正则表达式匹配后,日志为 logouting
该正则表达式匹配后 fluentd生成的日志数据为: "log_type":"logouting"
(?<protocol>[^\]]*) 原理同上,只是少了一个开始的匹配规则。意思是从当前字符匹配到 ] 字符,但不包括 ] 字符。
(?<protocol>[^\]]*) 匹配的原始日志数据为: success] 注意没得 [ 字符。
匹配完成后的日志数据为: sucess
以上解释了 (?<log_type>.....) 为单位的正则表达式规则,以下再逐个进行解释:
- (?<=\[) 表示:匹配 [ 字符,但不包括 [ 字符,\ 代表转义。
- [^\]] [^ ]* 表示:贪婪匹配到 ],空格 字符,但不包括 ] 空格 字符。
- \S 表示:匹配任何非空格字符,只匹配一个字符。
- $ 表示:匹配输入字符串的结尾位置。
至此,整个正则表达式匹配规则就说清楚了。也没看上去那么复杂。
最后再记录一个常用的表达式:
(?:匹配规则)? 表示:在原始数据中,(?:匹配规则)? 所包含的日志数据不存在时,跳过解析。
在编写日志数据格式化的正则表达式时,需要进行测试,下面笔者在分享一个fluentd的测试方法:
编写fluentd的配置文件:
[root@docker resource]# vi f.conf
# 模拟数据源,进行正则表达式测试
<source>
@type dummy
tag dum
dummy {"message":"[logouting][success]1111 from IP 10.10.10.10: Logging out successfully!"}
</source>
# 编写正则表达式
<filter dum>
@type parser
key_name message
<parse>
@type "regexp"
expression /(?<log_type>(?<=\[)[^\]] )\S\S(?<protocol>[^\]]*)\S(?<username>[^ ]*) (from IP )(?<from_ip>[^:]*)\S (?<info>.*)$/
</parse>
</filter>
# 输出到控制台
<match dum>
@type stdout
</match>
启动后验证:
[root@docker resource]# docker-compose up
......
fluentd | 2020-07-30 10:47:20.071595389 0000 dum: {"log_type":"logouting" "protocol":"success" "username":"1111" "from_ip":"10.10.10.10" "info":"Logging out successfully!"}
......