Logstash -filebeat 6.5 多行日志合并

日志内容:

authenticatorClient:         <82fa722c1abd2ee6effd39ac954f3927>
 loginMode:                   <2>
 timestamp:                   <509110741>
 version:                     <48>
2020-05-09 11:07:41.200 |INFO | SENT: 
 status:                <30>
 authenticatorServer:   <1f555a3d244ba1eaab8030cb668f592b>
 version:               <48>

一条日志多行出现的情况下 logstash默认过滤分成多条传输

到es显示的时候就是几条日志对于日常查询分析带来不便

解决方法:

filter 插件的multiline 可以通过正则完美解决

Logstash 5 以上默认 没有filter-multiline 插件了 如要另行安装

# ./bin/logstash-plugin install logstash-filter-multiline

安装好后 配置文件filter部分中增加如下内容

filter {
    ......
    multiline {
              pattern => "^%{TIMESTAMP_ISO8601} "  ## 已日期格式为开头的匹配
              negate => true                       ## 正则匹配成功
              what => "previous"                   ## 对下一个匹配出现前的内容进行合并
        }
}

Kibana查询日志内容合并成功

Logstash -filebeat 6.5 多行日志合并_第1张图片

多次查询后发现问题,日志合并行匹配错误数据不准确

参考资料发现

filter 设置 multiline 后,pipline worker 会自动将为 1,如果使用 filebeat,建议在 beat 中就使用 multiline,如果使用 logstash 作为 shipper,建议在 input 中设置 multiline,不要在 filter 中设置 multiline 

因为是通过filebeat传输所以重新配置filebeat进行合并

首先我们先了解下Filebeat在合并多行日志上有哪些配置选项

multiline.pattern
指定正则表达式去匹配指定的行,例如multiline.pattern: '^\[',意思是去匹配以[开头的行

multiline.negate
定义pattern是否被否认,默认值是false,若为true,意思是对上面的匹配进行反转(就是实际去匹配不以pattern的行)

multiline.match
指定Filebeat如何合并匹配的行,有两个值afterbefore

其实这个三个属性分开理解有点困难,下面结合官方doc中的例子去理解这三个属性之间的联系和作用

如果negate设置为falsematch设置为after,Filebeat就会把不匹配的行作为行首,把匹配的行插入到行首后
如果negate设置为truematch设置为after,Filebeat就会把匹配的行作为行首,把不匹配的行插入到行首后

multiline.flush_pattern
指定正则表达式去匹配指定的行作为multline-message的结束,刷新的内存,开始匹配新的多行

multiline.max_lines
指定合并最大行数

multiline.timeout
设定一个超时时间,在时间结束后,即使没有匹配到新pattern来启动新事件,Filebeat也会发送多行事件。默认值是5秒

 multiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}'
 multiline.negate: true
 multiline.match: after

重启filebeat 再次查询验证,合并日志正常,多次查询数据完整,无丢失

Logstash -filebeat 6.5 多行日志合并_第2张图片

你可能感兴趣的:(ELK)