文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106272704

在解决应用程序问题时,多行日志为开发人员提供了宝贵的信息。 堆栈跟踪就是一个例子。 堆栈跟踪是引发异常时应用程序处于中间的一系列方法调用。 堆栈跟踪包括遇到错误的相关行以及错误本身。 可以在此处查看Java堆栈跟踪的示例:

Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

当使用类似Elastic Stack的日志记录工具时,如果没有正确的配置,可能很难识别和搜索堆栈跟踪。 使用像Filebeat这样的开源轻型日志摄入器发送应用程序日志时,堆栈跟踪的每一行在Kibana中都将被视为单个文档。

因此,上面的堆栈跟踪将在Kibana中视为四个单独的文档。 这使得在堆栈跟踪中搜索和理解错误和异常变得很困难,因为它们与它们的上下文脱离了共同的事件。 使用Filebeat记录应用程序日志时,用户可以通过在filebeat.yml文件中添加配置选项来避免此问题。

你可以配置filebeat.yml输入节filebeat.inputs以添加一些多行配置选项,以确保将多行日志(如堆栈跟踪)作为一个完整文档发送。 将以下配置选项添加到filebeat.yml输入部分,将确保上面引用的Java堆栈跟踪将作为单个文档发送。

multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after

根据 Elastic 的官方文档介绍:

multiline.pattern

指定要匹配的正则表达式模式。 请注意,Filebeat支持的正则表达式模式与Logstash支持的模式有些不同。 有关受支持的正则表达式模式的列表,请参见正则表达式支持。 根据你配置其他多行选项的方式,与指定正则表达式匹配的行将被视为上一行的延续或新多行事件的开始。 你可以设置 negate 选项以否定模式。

multiline.negate

定义是否为否定模式,也就是和上面定义的模式相反。 默认为false。

multiline.match

指定Filebeat如何将匹配的行组合到事件中。 设置在之后 (after) 或之前 (before)。 这些设置的行为取决于你为否定指定的内容:

我们还是以上面的log例子为例。我们来创建一个叫做mulitline.log的文件:

mulitline.log

Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

我们创建一个 filebeat 的配置文件:

mulitiline.yml

filebeat.inputs:
- type: log
enabled: true
paths:
- /Users/liuxg/data/multiline/multiline.log
multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after output.elasticsearch:
hosts: ["localhost:9200"]
index: "multiline" setup.ilm.enabled: false
setup.template.name: multiline
setup.template.pattern: multiline

运行 filebeat,我们看一下被导入的文档的内容:

GET multiline/_search

{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "multiline",
"_type" : "_doc",
"_id" : "9FI7OnIBmMpX8h3C4Cx8",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2020-05-22T02:34:55.533Z",
"ecs" : {
"version" : "1.5.0"
},
"host" : {
"name" : "liuxg"
},
"agent" : {
"ephemeral_id" : "53a2f64e-c587-4f82-90bc-870274227c54",
"hostname" : "liuxg",
"id" : "be15712c-94be-41f4-9974-0b049dc95750",
"version" : "7.7.0",
"type" : "filebeat"
},
"log" : {
"offset" : 0,
"file" : {
"path" : "/Users/liuxg/data/multiline/multiline.log"
},
"flags" : [
"multiline"
]
},
"message" : """Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)""",
"input" : {
"type" : "log"
}
}
}
]
}
}

从上面,我们可以看到在 message 字段,它含有 stack trace 的总三行信息。

另外一个例子是在 Elastic 的官方文档中:

multiline.pattern: '^\['
multiline.negate: true
multiline.match: after

上面将匹配所有以 [ 为开头的行,并且后面非以 [ 为开头的行将被追加到匹配的那一行。那么它很好地匹配了像如下的日志:

[beat-logstash-some-name-832-2015.11.28] IndexNotFoundException[no such index]
at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.resolve(IndexNameExpressionResolver.java:566)
at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:133)
at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:77)
at org.elasticsearch.action.admin.indices.delete.TransportDeleteIndexAction.checkBlock(TransportDeleteIndexAction.java:75)

针对如下的信息:

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
at com.example.myproject.Author.getBookIds(Author.java:38)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
at com.example.myproject.Book.getId(Book.java:22)
at com.example.myproject.Author.getBookIds(Author.java:35)
... 1 more

我们可以采用如下的配置:

multiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:'
multiline.negate: false
multiline.match: after

在上面的例子中,它的 pattern 匹配了如下的情况:

这一行开始以一个 SPACE 为开头,并接着一个词 at
这一行以一个短语 Caused by 为开始的

更多参考,请参阅官方文档 https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html

除了上面提到的多行配置选项外,您还可以设置选项来刷新多行消息的内存,设置单个事件中可以包含的最大行数 multiline.max_lines,并且可以将超时时间设置为5秒(默认值)multiline.timeout。在指定的超时后,即使未找到新的模式来启动新事件,Filebeat也会发送多行事件。

让我们看一下使用multiline.flush_pattern的示例。 Filebeat的此配置选项对于包含事件以特定标记开始和结束的多行应用程序日志很有用。

[2015-08-24 11:49:14,389] Start new event
[2015-08-24 11:49:14,395] Content of processing something
[2015-08-24 11:49:14,399] End event

如果我们希望这些行在Kibana中显示为单个文档,我们将在filebeat.yml中使用以下多行配置选项:

multiline.pattern: ‘Start new event’
multiline.negate: true
multiline.match: after
multiline.flush_pattern: ‘End event’

从上面的配置选项中,当看到“Start new event”模式并且以下几行与该模式不匹配时,它们将被追加到与该模式匹配的前一行。 当看到以“End event”开头的一行时,flush_pattern选项将指示多行事件结束。

结论

将应用程序日志集中到一个位置是重要的第一步,可以帮助解决应用程序出现的任何问题。 确保在该工具中正确提取并显示了日志,可以帮助公司减少平均解决时间。

参考:

【1】https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html

使用Filebeat传送多行日志的更多相关文章

  1. 使用 Filebeat 对多行日志进行处理(multiline)

    Filebeat 收集日志的过程中,默认是按行收取的,也就是每一行都会默认是一个单独的事件并添加时间戳.但是在收集一些特殊日志的时候,往往一个事件包含有多行,例如 Java 的堆栈跟踪日志: 20-0 ...

  2. ELK学习笔记之filebeat合并多行日志示例

    0x00 概述 本节中的示例包括以下内容: 将Java堆栈跟踪日志组合成一个事件 将C风格的日志组合成一个事件 结合时间戳处理多行事件 同理,你可以把如下的正则应用在容器的yaml文件内. 0x01  ...

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

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

  4. 转 -Filebeat + Redis 管理 LOG日志实践

    Filebeat + Redis 管理 LOG日志实践 小赵营 关注 2019.01.06 17:52* 字数 1648 阅读 24评论 0喜欢 2 引用 转载 请注明出处 某早上,领导怒吼声远远传来 ...

  5. Filebeat使用模块收集日志

    1.先决条件 在运行Filebeat模块之前: 安装并配置Elastic stack 完成Filebeat的安装 检查Elasticsearch和Kibana是否正在运行,以及Elasticsearc ...

  6. ES & Filebeat 使用 Pipeline 处理日志中的 @timestamp

    使用 Pipeline 处理日志中的 @timestamp Filebeat 收集的日志发送到 ElasticSearch 后,会默认添加一个 @timestamp 字段作为时间戳用于检索,而日志中的 ...

  7. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  8. Logstash——multiline 插件,匹配多行日志

    本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...

  9. ElasticSearch+Logstash+Filebeat+Kibana集群日志管理分析平台搭建

    一.ELK搜索引擎原理介绍 在使用搜索引擎是你可能会觉得很简单方便,只需要在搜索栏输入想要的关键字就能显示出想要的结果.但在这简单的操作背后是搜索引擎复杂的逻辑和许多组件协同工作的结果. 搜索引擎的组 ...

随机推荐

  1. idea 分 环境 配置 线上 测试 本地

    在resources 新建application.properties 分开在resources 新建的多个环境的文件 #测试环境 applicaion-test.properties #开发环境 a ...

  2. GET 请求和 POST 请求的区别和使用

    作为前端开发, HTTP 中的 POST 请求和 GET 请求是经常会用到的东西,有的人可能知道,但对其原理和如何使用并不特别清楚,那么今天来浅谈一下两者的区别与如何使用. GET请求和POST请求的 ...

  3. 解决Windows10、Windows11文件名无法大写的问题

    问题描述: 同一目录下的不同文件有些可以用大写字母做文件名,有些输入大写字母完成后自动变成小写. 甚至同一文件的文件名中的相同字母也会有这种情况,例如:文件名为"bu人BU"的文件 ...

  4. day01--DOS常用命令

    打开CMD的方式 开始+系统+命令提示符 Win键+R输入cmd打开控制台(推荐使用) 在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口 资源管理器的地址栏前面加,上cmd路径 ...

  5. 膜 社论(egg drop)

    题面 \(n\) 楼 \(m\) 个鸡蛋,从 \(k\) 楼及以上扔下去会碎,不能再测试 . 问至少需要扔几次确定 \(k\) . \(n\le 10^{18}\),\(m\le 64\) . 题解 ...

  6. linux-0.11分析:boot文件 head.s 第三篇随笔

    head.s 参考 [github这个博主的][ https://github.com/sunym1993/flash-linux0.11-talk ] 改变栈顶位置 _pg_dir: startup ...

  7. web前端要学些什么,学习思路

    有没有Web前端大神给个意见 我已学了 html  css JS 马上要学Vue或React不知道那个好 需不需要先了解一下jQuery 还需要学些什么

  8. benchmark性能测试

    目录 benchmark介绍 benchmark运行 benchmark运行参数 benchmark性能测试案例 benchmark介绍 基准测试主要是通过测试CPU和内存的效率问题,来评估被测试代码 ...

  9. 如何在CDH5上部署Dolphin Scheduler 1.3.1

    点击蓝色字关注! 本篇文章大概8440字,阅读时间大约20分钟 本文记录了在CDH5.16.2集群上集成Dolphin Scheduler 1.3.1的详细流程,特别注意一下MySQL数据库的连接串! ...

  10. DolphinScheduler 线上 Meetup 视频回放(07.25)

    上周六下午 DolphinScheduler 社区联合 Doris 社区进行了 2020 年首次线上 Meetup,各位讲师都做了非常精彩的分享,也吸引了 1900 多位技术伙伴观看. 其中 Dolp ...