一、背景

在我们的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

logstash处理多行日志-处理java堆栈日志的更多相关文章

  1. java Log日志规范

    Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...

  2. 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...

  3. K8S学习笔记之filebeat采集K8S微服务java堆栈多行日志

    0x00 背景 K8S内运行Spring Cloud微服务,根据定制容器架构要求log文件不落地,log全部输出到std管道,由基于docker的filebeat去管道采集,然后发往Kafka或者ES ...

  4. logstash匹配多行日志

    在工作中,遇到一个问题就是日志的处理,首选的方案就是ELFK(filebeat+logstash+es+kibana) 因为之前使用过logstash采集日志的时候,非常的消耗系统的资源,所以这里我选 ...

  5. java学习日志(1):命令行and小程序

    1.dos命令行,常见的命令 dir:列出当前目录下的文件以及文件夹md:创建目录rd:删除目录(必须空)cd:进入指定目录cd.. :退回到上一级目录cd/:退回到根目录del:删除文件exit:退 ...

  6. JAVA主流日志梳理

    JAVA主流日志梳理 引入 历史故事 Log4j - JDK1.3及以前 JUL - JDK1.4 JCL - 日志门面commons-logging的出现 SLF4j - 可能是最好的日志框架 lo ...

  7. Java Slf4j日志配置输出到文件中

    1.概述 新项目需要增加日志需求,所以网上找了下日志配置,需求是将日志保存到指定文件中.网上找了下文章,发现没有特别完整的文章,下面自己整理下. 1.Java日志概述 对于一个应用程序来说日志记录是必 ...

  8. 带你掌握Java各种日志框架

    一:日志基本概念及框架 1:什么是日志 Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug调试功能来跟踪解决Bug,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...

  9. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

随机推荐

  1. 使用shell脚本实现everthing的功能

    我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示: Linux 下也有一些类似于 everything ...

  2. 第07课:GDB 常用命令详解(下)

    本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 disassemble 命令 当进行一些高级 ...

  3. API:获取当前用户的公网IP

    在vue项目根目录下" public " 文件夹中的index.html,也就是根节点所在的文件引入JS,vue项目中静态文件需要在这里引入,用 script 标签规避跨域 < ...

  4. promise入门基本使用

    Promise入门详解和基本用法   异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任 ...

  5. PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法

    虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法.就当是扩展一下自己的知识体系. 切换用户 首先就是切换 ...

  6. 关于PHP的方法参数类型约束

    在之前的文章PHP方法参数的那点事儿中,我们讲过关于PHP方法参数的一些小技巧.今天,我们带来的是更加深入的研究一下PHP中方法的参数类型. 在PHP5之后,PHP正式引入了方法参数类型约束.也就是如 ...

  7. DEDEcms手机网站添加详情内页上一页/下一页的翻页功能

    修改文件include/arc.archives.class.php文件. 1.搜索 function GetPreNext($gtype='') 2.将这个函数的所有内容替换为 function G ...

  8. ecshop首页调用团购说明

    要在首页调用购买. 发现在首页还不能直接调用团购说明.查看了一下代码发现要修改下才能调 打开根目录的 index.php 文件找到 $sql = 'SELECT gb.act_id AS group_ ...

  9. P6378-[PA2010]Riddle【2-SAT】

    正题 题目链接:https://www.luogu.com.cn/problem/P6378 题目大意 给出\(n\)个点\(m\)条边的一张无向图,图中有\(k\)种颜色的点. 要求每种颜色选择一个 ...

  10. Hyper-V CPU设置

    前言 最近在用Hyper-V测试项目,发现在运行过程中发现项目总数崩掉,几经发现有一个共性,CPU占用率100%,分析问题发现问题出在Hyper-V CPU设置上,Hyper-V装系统就不赘述了,网上 ...