vlambda博客
学习文章列表

如何使用 logstash 处理跨行日志 ?

问题

有时一条日志会跨多行,比如 Java 的错误 stacktrace,logstash 如何将多行日志合并成一条进行处理?

例如,想要把这样的日志:

[2020-01-15] ERROR some exception: second exception third exception

处理成如下形式

[2020-01-15] ERROR some exception:\n second exception\n third exception

思路

参考链接:https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

1.multiline 插件可以实现该功能,但是输入不能是来自多个主机的(比如各种 beat),因为多个主机的日志会混在一起,产生未知的结果。2.multiline 插件的基本原理是:当一行日志匹配或不匹配某个预定义的模式时,将这条日志与上一条或下一条日志合并成一条。3.multiline 有三个重要参数:pattern,negate,what。pattern 是模式字符串,可以是正则表达式,也可以是预定义的模式名;negate 的可选值为 true 或者 false,true 表示匹配了 pattern 进行合并,false 表示不匹配 pattern 时进行合并;what 的可选值为 previous 或者 next,previous 表示合并到上一行,next 表示合并到下一行。

答案

参考配置如下:

input { file { path => ["/Users/iamabug/1.log"] codec => multiline { # 可以不用写完整的正则表达式,只写开头,能够区分是换行的日志即可 pattern => "^\[\d{4}-\d{2}-\d{2}\]\s+[a-zA-Z]+\s+[\s\S]+" negate => true what => "previous" } }}
output { # 为了测试方便,直接输出在终端 stdout {}}

验证

1.在 logstash 安装目录执行如下命令:

bin/logstash --path.config config/logstash.conf

    2.向 /Users/iamabug/1.log 末尾添加如下日志

[2020-01-15] ERROR some exception:second exceptionthird exception[2020-01-15] INFO no problem

注意:这里额外添加了一条符合模式的单行日志,否则 logstash 会一直等待。

    3.观察 logstash 的输出:

可以看到,多行日志被使用换行符拼接成了一条日志,存储在 message 中。