快捷搜索:  汽车  科技

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正则表达式探索历程。


fluentdpm模型如何设置(正则表达式详解)(1)

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!"} ......

猜您喜欢: