关于java:logstash处理多行日志处理java堆栈日志

36次阅读

共计 2819 个字符,预计需要花费 8 分钟才能阅读完成。

一、背景

在咱们的 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@299321e2
129905 [2021-05-11 13:31:19] [ip=] WARN  o.s.c.a.AnnotationConfigApplicationContext [doClose(994)] - Exception thrown from ApplicationListener handling ContextClosedEvent
org.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)] - Clos
129905 [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://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

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

正文完
 0