如何在一个 Pipeline 中切割多种不同格式的日志?

在日常的日志中,因为业务的不同,日志会呈现出多种形态,此时,需写多个 Grok 切割,为提高 Grok 的运行效率,可根据日志出现的频率高低,优先匹配出现频率更高的那个 Grok,这样,大概率日志在前面几个 Grok 中就匹配上了,避免了无效的匹配。

在日志切割中,Grok 匹配是性能开销最大的部分,故避免重复的 Grok 匹配,能极大的提高 Grok 的切割性能。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

grok(_, "%{NOTSPACE:client_ip} %{NOTSPACE:http_ident} ...")

if client_ip != nil {   

# 证明此时上面的 grok 已经匹配上了,那么就按照该日志来继续后续处理   

...

else {   

# 这里说明是不同的日志来了,上面的 grok 没有匹配上当前的日志   

grok(_, "%{date2:time} \\[%{LOGLEVEL:status}\\] %{GREEDYDATA:msg} ...")

    if status != nil {      

 # 此处可再检查上面的 grok 是否匹配上...   

else {       

# 未识别的日志,或者,在此可再加一个 grok 来处理,如此层层递进   

}

}

如何丢弃字段切割

在某些情况下,我们需要的只是日志==中间的几个字段==,但不好跳过前面的部分,比如

1

200 356 1 0 44 30032 other messages

其中,我们只需要 44 这个值,它可能代码响应延迟,那么可以这样切割(即 Grok 中不附带 :some_field 这个部分):

1

grok(_, "%{INT} %{INT} %{INT} %{INT:response_time} %{GREEDYDATA}"

add_pattern() 转义问题

大家在使用 add_pattern() 添加局部模式时,容易陷入转义问题,比如如下这个 pattern(用来通配文件路径以及文件名):

1

(/?[\w_%!$@:.,-]?/?)(\S+)? 

如果我们将其放到全局 pattern 目录下(即 pipeline/pattern 目录),可这么写:

1

# my-testsource_file (/?[\w_%!$@:.,-]?/?)(\S+)?

 

如果使用 add_pattern(),就需写成这样:

# my-test.p
add_pattern('source_file', '(/?[\\w_%!$@:.,-]?/?)(\\S+)?')

即这里面反斜杠需要转义。

本文摘自杏耀技术的文章转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值