前言:
而今我们对“正则表达式截取以什么开头和什么结尾的数据为准”可能比较注重,姐妹们都想要了解一些“正则表达式截取以什么开头和什么结尾的数据为准”的相关文章。那么小编同时在网摘上搜集了一些关于“正则表达式截取以什么开头和什么结尾的数据为准””的相关文章,希望同学们能喜欢,咱们一起来了解一下吧!在使用了半个月clickhouse日志平台后,数据量目前已突破1亿,在使用过程中,笔者梳理了几个日志平台的技术点,特此记录,分享。
首当其冲的莫过于正则表达式的学习和使用。笔者开始接触Fluentd时,也曾被吓到,感觉很难很复杂,后面,经过深度摸索、学习后,最终还是将fluentd的正则表达式拿下。
下面,笔者将通过一个例子详细介绍,Fluentd正则表达式探索历程。
日志原文:
[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!"}......