日志内容:
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查询日志内容合并成功
多次查询后发现问题,日志合并行匹配错误数据不准确
参考资料发现
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如何合并匹配的行,有两个值after
和before
其实这个三个属性分开理解有点困难,下面结合官方doc中的例子去理解这三个属性之间的联系和作用
如果negate
设置为false
,match
设置为after
,Filebeat就会把不匹配的行作为行首,把匹配的行插入到行首后
如果negate
设置为true
,match
设置为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 再次查询验证,合并日志正常,多次查询数据完整,无丢失