龙空技术网

Fluentd 正则表达式详解

opser 199

前言:

而今我们对“正则表达式截取以什么开头和什么结尾的数据为准”可能比较注重,姐妹们都想要了解一些“正则表达式截取以什么开头和什么结尾的数据为准”的相关文章。那么小编同时在网摘上搜集了一些关于“正则表达式截取以什么开头和什么结尾的数据为准””的相关文章,希望同学们能喜欢,咱们一起来了解一下吧!

在使用了半个月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!"}......

标签: #正则表达式截取以什么开头和什么结尾的数据为准 #fluent讲解