Logstash 未为多行事件添加Filebeat多行标记

Logstash 未为多行事件添加Filebeat多行标记,logstash,elastic-stack,filebeat,Logstash,Elastic Stack,Filebeat,我所做的: 我在filebeat.yml文件中启用了多行模式: multiline.pattern:'^[[:space:]+|^由以下原因引起: 多行。否定:false multiline.match:之后 我的示例日志文件包含多行异常: 线程“main”java.lang.IllegalStateException中的异常:书籍具有null属性 在com.example.myproject.Author.getBookIds上(Author.java:38) 位于com.example.m

我所做的:

我在filebeat.yml文件中启用了多行模式:

multiline.pattern:'^[[:space:]+|^由以下原因引起:
多行。否定:false
multiline.match:之后
我的示例日志文件包含多行异常:

线程“main”java.lang.IllegalStateException中的异常:书籍具有null属性 在com.example.myproject.Author.getBookIds上(Author.java:38) 位于com.example.myproject.Bootstrap.main(Bootstrap.java:14) 原因:java.lang.NullPointerException 位于com.example.myproject.Book.getId(Book.java:22) 在com.example.myproject.Author.getBookIds上(Author.java:35) ... 还有一个 线程“main”java.lang.NullPointerException中出现异常 在com.example.myproject.Book.getTitle上(Book.java:16) 在com.example.myproject.Author.getBookTitles上(Author.java:25) 位于com.example.myproject.Bootstrap.main(Bootstrap.java:14) 从filebeat日志中,我可以看到这些多行异常得到了正确的解析:

2017-05-15T08:21:36-07:00 DBG发布:{
“@时间戳”:“2017-05-15T15:21:31.768Z”,
“节拍”:{
“主机名”:“WIN-UV5OA3SO3LF”,
“名称”:“WIN-UV5OA3SO3LF”,
“版本”:“5.2.0”
},
“输入类型”:“日志”,
“消息”:“线程中的异常\”main \“java.lang.IllegalStateException:一本书在com.example.myproject.Author.getBookIds(Author.java:38)\n在com.example.myproject.Bootstrap.main(Bootstrap.java:14)\n使用者:java.lang.NullPointerException\n在com.example.myproject.book.getId(book.java:22)\n位于com.example.myproject.Author.getBookIds(Author.java:35)\n…还有1个“,
“偏移量”:409,
“来源”:“C:\\Filebeat\\test\\testLog.txt”,
“类型”:“日志”
}
2017-05-15T08:21:41-07:00 DBG发布:{
“@时间戳”:“2017-05-15T15:21:31.768Z”,
“节拍”:{
“主机名”:“WIN-UV5OA3SO3LF”,
“名称”:“WIN-UV5OA3SO3LF”,
“版本”:“5.2.0”
},
“输入类型”:“日志”,
“消息:”com.example.myproject.Book.getTitle(Book.java:16)\n com.example.myproject.Author.getBookTitles(Author.java:25)\n com.example.myproject.Bootstrap.main(Bootstrap.java:14)上的“线程中的异常\”main \“java.lang.NullPointerException”,
“偏移量”:669,
“来源”:“C:\\Filebeat\\test\\testLog.txt”,
“类型”:“日志”
}
问题:

  • filebeat分析的多行事件未标记为 多行
  • 由于这个原因,我在logstash上的grok过滤器无法对其进行相应处理

任何提示都将不胜感激

很抱歉,我没有回答这个问题,相反,我建议从另一个角度来看这个问题:为什么不在每行新日志的开头引入固定模式(这是常见的做法)

这允许使用-模式的多行功能,这是更容易和更直接的方式

让我们接受每一行都以日期开头,如下所示:

2019.10.23 01:01:01.384500[错误]线程“main”java.lang.IllegalStateException中的异常:书籍具有null属性
在com.example.myproject.Author.getBookIds上(Author.java:38)
位于com.example.myproject.Bootstrap.main(Bootstrap.java:14)
原因:java.lang.NullPointerException
位于com.example.myproject.Book.getId(Book.java:22)
在com.example.myproject.Author.getBookIds上(Author.java:35)
... 还有一个
2019.10.23 01:02:01.384500[错误]线程“main”java.lang.NullPointerException中出现异常
在com.example.myproject.Book.getTitle上(Book.java:16)
在com.example.myproject.Author.getBookTitles上(Author.java:25)
位于com.example.myproject.Bootstrap.main(Bootstrap.java:14)
现在,只需定义每条新线的起始模式,并打开否定模式:

filebeat.inputs:
-类型:原木
已启用:true
# https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
#此regexp描述日志行的开头(例如,“2019.10.23 01:01:01:01.384500…”。
multiline.pattern:'^\d{4}.\d{2}.\d{2}\d{2}:\d{2}:\d{2}'
多行。否定:真
multiline.match:之后
路径:
- ..
处理器:
- ..
-剖析:
#标记器语法:https://www.elastic.co/guide/en/logstash/current/plugins-filters-dissect.html.
标记器:“%{timestamp}[%{level}]%{?message}”
# https://www.elastic.co/guide/en/beats/filebeat/master/dissect.html
字段:“消息”
目标前缀:“

您的筛选器中是否有某些部分仅使用多行执行?您可以尝试一种“暴力”解决方案,在需要的地方插入
mutate{add_tag=>“multiline”}
感谢我可以尝试自己解除阻止的可能解决方案。但作为一个长期的解决方案,我更愿意理解我的方法中缺少了什么并加以解决。我绝对同意你的观点。这是一个临时的“快速”解决方案,而不是一个好的长期解决方案。


    if "multiline" in [tags] {
      grok {
        match => ["message", "%{JAVASTACKTRACEPART}"]
      }
    }