一、背景

在我们的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. systemctl --now参数

    1.我们安装一个httpd服务来测试一下 --now参数 yum install httpd 2.查看一下当前服务状态  可以看到服务没有启动 而且服务没有自启 [root@master1 ~]# s ...

  2. logstash-input-jdbc 同时同步多个表的情况

    input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost:3306/crm?zeroDateTimeBehavi ...

  3. error: subscripted value is neither array nor pointer问题解决

    在运行程序的时候报错:error: subscripted value is neither array nor pointer 原因分析:下标值不符合数组或指针要求,即操作的对象不允许有下标值. 出 ...

  4. Hello Wolrd

    这是一篇测试文章.....后续会更新一些文章.

  5. mybatis一对一联表查询的两种常见方式

    1.一条语句执行查询(代码如下图)  注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...

  6. linux停止进程

    $ kill -QUIT 主进程号 例如:kill -QUIT 1708 这种方式相对来说会有一个停止的过程,先将子进程停止掉,然后再停掉主进程. 快速停止Nginx: $ kill -TERM 主进 ...

  7. Win7 ASP连接数据库“未找到提供程序.该程序可能未正确安装”问题

    是自己装的64位Windows 7系统的原因,默认64位环境下,IIS应用程序池未启用32位应用程序,我们只需要启用一下就可以了.打开IIS 7,定位到"应用程序池",然后选择使用 ...

  8. 安装redis3.0.5

    首先在官网下载redis-3.0.5.tar.gz 在某一个要安装redis的目录下输入命令 tar xzf redis-3.0.5.tar.gz 实现解压缩 进入解压缩后的redis目录 输入mak ...

  9. 51nod1836-战忽局的手段【期望dp,矩阵乘法】

    正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1836 题目大意 \(n\)个点\(m\)次随机选择一个点标记(可以重复) ...

  10. GitHub 和 Gitee 开源免费 10 个超赞后台管理面板,看完惊呆了!

      软件工程师在实际项目开发中不可避免需要依赖一些前后端的后台管理系统框架,而不是从零开始一点点的搭建,浪费人力.目前市面上有很多开放源码.且免费的后台管理面板,样式色彩也比较丰富美观.   今天整理 ...