2

kubernetes使用filebeat multiline自定义收集日志

 2 years ago
source link: https://zhangrr.github.io/posts/20211111-k8s_filebeat/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Kubernetes使用filebeat Multiline自定义收集日志

2021-11-11 2 分钟阅读

我们介绍了如何在 kubernetes 环境中使用 filebeat sidecar 方式收集日志

使用的是 filebeat 的 moudle 模块,但凡是常用的软件,基本都有对应的模块可用,所以我们首先应该使用模块来收集日志。

那对于一些我们自己写的 Go 软件呢,或者根本不是标准的,那该怎么办呢?

那就自定义 filebeat.inputs,网上的 filebeat 例子,其实大多都是这样的

很简单,给个例子

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

看如上日志,如果不用模式匹配的话,那么会送5条记录到 ES, Kibana 看起来就十分割裂了。

所以要用正则把底下的4行和上面的第1行合在一起,合并成一条就记录推送到 ES 去

仔细观察,开头一行是以 [ 开始的,所以正则就是 ‘^\[',我们要匹配的是底下的4行,必须反转一下模式。

multiline 的 negate 属性,这个是指定是否反转匹配到的内容,这里如果是 true 的话,反转,那就是选择不以 [ 开头的行。 netgate 属性的缺省值是 false

multiline 的 match 属性,after 指追加到上一条事件(向上合并),before 指合并到下一条(向下合并)

于是,我们就可以写出以下的匹配模式,这样就把匹配到条目追加到上一条,合并在一起了:

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /Users/liuxg/data/multiline/multiline.log
    multiline.type: pattern
    multiline.pattern: '^\['
    multiline.negate: true
    multiline.match: after

output.elasticsearch:
 hosts: ["localhost:9200"]
 index: "multiline"

再给个例子,java 的 stack 调用,日志格式如下:

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)

分析一下:

  • 匹配到开头是空格的那些行,正则 ‘^[[:space]]’
  • 匹配的行不反转,就是要那些空格开头的行,所以 negate 是缺省的 false
  • 匹配的空格行追加到上一个事件,向上合并,所以 match 是 after
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /Users/liuxg/data/multiline/multiline.log
    multiline.type: pattern
    multiline.pattern: '^[[:space:]]'
    multiline.negate: false
    multiline.match: after

再给个例子,假如你在 Go 程序里定义了输出日志的格式,以 Start new event 开头,以 End event 结尾

[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
[2015-08-24 11:50:14,389] Some other log
[2015-08-24 11:50:14,395] Some other log
[2015-08-24 11:50:14,399] Some other log
[2015-08-24 11:51:14,389] Start new event
[2015-08-24 11:51:14,395] Content of processing something
[2015-08-24 11:51:14,399] End event

我们就用到 filebeat multiline 的另一个开关,flush_pattern,来控制如何结束,注意 negate 是 true ,匹配到的是 Start 和 End 中间的部分:

multiline.type: pattern
multiline.pattern: 'Start new event'
multiline.negate: true
multiline.match: after
multiline.flush_pattern: 'End event'

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /Users/liuxg/data/multiline/multiline.log
    multiline.type: pattern
    multiline.pattern: 'Start new event'
    multiline.negate: true
    multiline.match: after
    multiline.flush_pattern: 'End event'

给两篇参考,大家一定要先看那篇原版英文的,中文的那篇翻得不太好;最好两篇对照着看。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK