logstash处理多行日志-处理java堆栈日志

网友投稿 345 2022-09-26

logstash处理多行日志-处理java堆栈日志

logstash处理多行日志-处理java堆栈日志

​​一、背景​​​​二、需求​​​​三、实现思路​​

​​1、分析日志​​​​2、实现,编写pipeline文件​​

​​四、注意事项​​​​五、参考文档​​

一、背景

在我们的java程序中,经常会输出一些日志,来帮助我们来分析一些问题。但是对于我们的​​异常​​​来说,它可能存在多行,因此我们就需要处理这种多行的事件。在 logstash 中,我们可以借助 ​​multiline​​ codec 来处理。

二、需求

假设我们有如下数据。

129904 [2021-05-11 13:31:19] [ip=] INFO o.s.c.a.AnnotationConfigApplicationContext [doClose(984)] - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3e5d4f6b: startup date [Tue May 11 13:29:11 CST 2021]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@299321e2129905 [2021-05-11 13:31:19] [ip=] WARN o.s.c.a.AnnotationConfigApplicationContext [doClose(994)] - Exception thrown from ApplicationListener handling ContextClosedEventorg.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaAutoServiceRegistration': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:216) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080)

需要将如上的数据做一个多行展示。

129904 的作为一行展示。

129905 的异常堆栈数据作为一行展示。

三、实现思路

1、分析日志

129904 [2021-05-11 13:31:19] [ip=] INFO o.s.c.a.AnnotationConfigApplicationContext [doClose(984)] - Clos129905 [2021-05-11 13:31:19] [ip=] WARN o.s.c.a.AnnotationConfigApplicationContext [doClose(994)] - Exception thrown from ApplicationListener handling ContextClosedEvent

从上方简化的日志可知,我们的日志每行都是以一个​​数字​​开头,那么可以认为以数字开头的行是一个单独的行,以非数字开头的行是隶属于上一行的,即是一个多行的。

2、实现,编写pipeline文件

​​vim java-exception.conf​​

input { file { path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/java-exception/application*.log"] start_position => "end" sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/java-exception/sincedb.db" sincedb_write_interval => "15 seconds" mode => "tail" type => "application" codec => multiline { pattern => "^\d+" negate => "true" what => "previous" charset => "UTF-8" auto_flush_interval => 3 } }}filter { }output { stdout { codec => rubydebug { } }}

我们主要关注的是 ​​multiline​​中的配置

pattern: 这个是用来匹配文本的表达式,也可以是​​grok​​表达式what: 如果​​pattern​​匹配成功的话,那么匹配行是归宿于上一个事件,还是归属于下一个事件。

previous: 归属于上一个事件next: 归属于下一个事件

negate:是否对 pattern 的结果取反

false: 不取反,是默认值。true: 取反。将多行事件扫描过程中的行匹配逻辑取反(如果pattern匹配失败,则认为当前行是多行事件的组成部分)

auto_flush_interval:当匹配到一个多行格式时,在 auto_flush_interval秒之内,如果没有新的行匹配的话,则会转换成 logstash 的一个事件进行发布。默认没有设置。单位是:秒(s)

四、注意事项

1、默认情况下,logstash 每读取到一行就会发送一个事件。

2、如果要发送多行事件,就需要使用 ​​multiline​​ 来实现。

3、如果我们的 logstash 在一个 pipeline 中存在多个输入,那么多行的处理,应该在发送数据的源头解决。即,在logstash自身不处理多行。因为可能会导致数据错乱。

五、参考文档

1、​​https://elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html​​

2、​​https://elastic.co/guide/en/logstash/current/multiline.html​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:击败爱立信,华为又拿下一个5G订单!已获非洲40国力挺!
下一篇:Prometheus监控Canal
相关文章

 发表评论

暂时没有评论,来抢沙发吧~