天天看点

FileBeat介绍与案例

作者:ddmonk

(一)Filebeat介绍

FileBeat是一个轻量级的日志收集工具,他可以直接对接ES、Logstash、Kafka、Redis等。

FileBeat的工作原理:FileBeat启动一个或多个Input,每个log日志FileBeat开启了harvester。每个harvester读取单个log日志获取新写入的内容并将其发送至libbeat,libbeat将整合的数据发送至output,output发送至对应的目标服务。整体如图所示:

FileBeat介绍与案例

FileBeat整体架构

FileBeat主要有两个有两个重要组件:Inputs和harvesters。这两个组件一起完成读取文件内容并把数据发送至output中去。

(二)FileBeat中的重要组件及其作用

  • Harvester

harvester主要的作用是读取耽搁文件的内容,它按行读取并将内容发送至output。由于harvester负责打开或者关闭文件,所以在harvester运行过程中,这个文件的fd将会一直打开,也就是说直到harvester关闭前,这个文件的磁盘空间将一直保留。harvester的关闭可以使用close_inactive来控制。

  • Input

Input是负责管理所有的harvesters和找出所有带采集的内容。如果input的类型是log,input会去匹配所有满足配置路径的文件,并对每个文件开启harvester,每个文件都有个自己的一个Go routine。

样例如下:

filebeat.inputs:
- type: log
  paths:
    - /var/log/*.log
    - /var/path2/*.log
           

(三)Filebeat采集案例:

3.1 资源:

链接:https://pan.baidu.com/s/157WchxmBQKMWFz0CcC9mRA 提取码:l2b0

FileBeat下载包解压并修改配置:

>unzip filebeat-7.8.0.zip
>cd filebeat-7.8.0
>vim conf.yml
           

3.2背景

目的

为了便于在ELK中查看到对应日志需要对日志进行切割,包括他的日志级别、线程、类等信息。同时,对异常出现换行等也需要支持。

日志样例如下:
2022-11-26 16:31:26,386 195283108 DEBUG [lb-console-heartbeat-send-task-thread-2] (PidUtil.java:22) com.test.info.PidUtil - getPid used:43 (ms)           
当前部署情况:

当前采用了比较主流的部署方式:

FileBeat介绍与案例

FileBeat->Logstash->ElasticSearch

配置文件:
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/test/xxx/test.log
  multiline.type: pattern
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  tags: ["testlog"]

fields:
  service: web-test
  project: test-web

output.logstash:
  hosts: ["192.141.148.123:5044"]

processors:
  - dissect:
      when.contains:
        tags: "testlog"
      tokenizer: "%{} %{} %{} %{level} [%{thread}] (%{class}) %{msg}"
      field: "message"
      target_prefix: ""
           

启动命令:

回到根目录
./filebeat -e -c ./conf.yml &
           
注意点:
  • 异常日志会有换行等情况,日志需支持
multiline.type: pattern
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
           
  • 日志需要切割,故涉及到processor中的dissect
processors:
  - dissect:
      when.contains:
        tags: "livebosLog"
      tokenizer: "%{} %{} %{} %{level} [%{thread}] (%{class}) %{msg}"
      field: "message"
      target_prefix: ""
           

Processor可以对读取的数据进行简单的处理每个processor接收event数据、处理event数据、返回event数据,如果有多个processors,他的处理过程是按照配置文件顺序执行。

event -> processor 1 -> event1 -> processor 2 -> event2 ...

Dissect processor可以按照定义的格式切割字符串

样例如下:

processors:
  - dissect:
      tokenizer: "%{key1} %{key2} %{key3|convert_datatype}"
      field: "message"
      target_prefix: "dissect"
           

主要属性介绍:

tokenizer

定义切割的格式,convert datatype可以在切割完成后自动地将string转化成integer,long,float,boolean或ip.

field

需要切割的event字段名称。默认是message

target_prefix

切割后属性的前缀。

结果:

FileBeat介绍与案例

参考文献:

https://blog.csdn.net/qq_27818541/article/details/108229185

https://www.elastic.co/guide/en/beats/filebeat/current/how-filebeat-works.html

https://www.elastic.co/guide/en/beats/filebeat/current/dissect.html

https://mritd.com/2020/08/19/how-to-modify-filebeat-source-code-to-processing-logs/