Filebeat 学习笔记

Filebeat 是一个轻量级的日志采集工具, 监听日志的修改, 并将它们传给 Elasticsearch 或 Logstash

Filebeat 工作流程如下图所示

Filebeat 学习笔记_第1张图片

组成

Filebeat 主要包含 inputs 和 harvesters 两大组件

  1. inputs 主要负责查找可供读取的资源, 最常见的资源是日志文件, 对应 filebeat 配置中的输入类型 type 为 log
filebeat.inputs:
- type: log
  paths:
    - /var/log/*.log

以上内容配置 filebeat 从 /var/log 目录以 .log 结尾的所有文件中读取日志数据

  1. inputs 每找到一个适合的文件后, 就启动一个 harvester 打开该文件, 然后逐行读取内容并发给 output, 只有 harvester 结束运行后才关闭文件描述符

filebeat 会记录每个日志文件的读取进度, 每隔一段时间将进度信息保存至 registry 文件, 当 filebeat 重启时, 从 registry 文件获取最后读取的偏移位置


安装

下载页面

下载二进制压缩文件并解压

tar -xzf filebeat-7.14.1-linux-x86_64.tar.gz
sudo mv filebeat-7.14.1-linux-x86_64 /usr/share/

配置环境变量, 将以下内容置于 .bashrc 末尾

export PATH="$PATH:/usr/share/filebeat-7.14.1-linux-x86_64"

配置

配置文件示例(假设保存于 ~/Public/filebeat.yaml)

filebeat.inputs:
- type: log
  paths:
    - /home/jianghuixin/Public/Test.log
output.console:
  enabled: true
  pretty: true
path.home: /home/jianghuixin/Public/Filebeat
  1. 为了方便测试, 输出直接流向终端
  2. 指定 home 目录为 ~/Public/Filebeat, 默认为当前目录
    • registry 文件保存于 ~/Public/Filebeat/data
    • filebeat 本身的日志文件保存于 ~/Public/Filebeat/logs

测试文件 Test.log 内容为:

01-Filebeat
02-Filebeat
03-Filebeat

启动 filebeat

# filebeat 配置文件仅属主可写, 属组和其他用户没有写入的权限
chmod u+x,go-w ~/Public/filebeat.yaml

# -c FILE 指定 filebeat 配置文件
filebeat -c ~/Public/filebeat.yaml

结果包含 3 个 JSON 输出(仅列举其中之一)

{
  "@timestamp": "2021-09-13T06:15:46.235Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.14.1"
  },
  "log": {
    "file": {
      "path": "/home/jianghuixin/Public/Test.log"
    },
    "offset": 24
  },
  "message": "03-Filebeat",
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.10.0"
  },
  "host": {
    "name": "911ME"
  },
  "agent": {
    "hostname": "911ME",
    "ephemeral_id": "c0b23fa8-5776-4cf4-8c8a-ed65f0cc50d4",
    "id": "a59bb19c-e987-449c-9d7c-c0663e316ec0",
    "name": "911ME",
    "type": "filebeat",
    "version": "7.14.1"
  }
}

测试配置文件

# 测试配置是否正确
filebeat test config -c ~/Public/filebeat.yaml

# 测试输出是否正常, 针对 Logstash, Elasticsearch 等输出, 检查能否成功连接
filebeat test output -c ~/Public/filebeat.yaml

读取多行

有些日志的格式并不是一行对应一条日志, 例如一条报错信息会占用多行, 通过设置 multiline 读取多行日志并输出为一条日志

multiline 包含以下具体配置项:

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

multiline.type 通常为 pattern 表示正则匹配, 其内部使用 Golang 的正则匹配

这里 multiline 的配置规则与 Logstash multiline codec 基本一致

配置项的含义如下图所示:

Filebeat 学习笔记_第2张图片


这里通过 Python 的错误日志演示

Traceback (most recent call last):
  File "Test.py", line 1, in 
    1 / 0
ZeroDivisionError: division by zero
Traceback (most recent call last):
  File "Test.py", line 1, in 
    test
NameError: name 'test' is not defined
Traceback (most recent call last):
  File "Test.py", line 1, in 
    import django
ModuleNotFoundError: No module named 'django'

此处采用上图中的第三个配置, 以 Traceback 为起始行, 其它行均合到该行, 直至另一个 Traceback 行


Filebeat 的配置为:

filebeat.inputs:
- type: log
  paths:
    - /home/jianghuixin/Public/Test.log
  fields:
    language: Python3
  multiline.type: pattern
  multiline.pattern: '^Traceback'
  multiline.negate: true
  multiline.match: after
output.console:
  enabled: true
  pretty: true
path.home: /home/jianghuixin/Public/Filebeat

fields 字段会原封不动地保存至当前输入对应的输出中


输出中包含 3 个消息, 以下为最后一条消息:

{
  "@timestamp": "2021-09-15T15:11:52.906Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.14.1"
  },
  "input": {
    "type": "log"
  },
  "fields": {
    "language": "Python3"
  },
  "ecs": {
    "version": "1.10.0"
  },
  "host": {
    "name": "911ME"
  },
  "agent": {
    "id": "b144ad98-53d1-4d0d-bbb8-89787981e709",
    "name": "911ME",
    "type": "filebeat",
    "version": "7.14.1",
    "hostname": "911ME",
    "ephemeral_id": "2dd82e68-2b63-4a20-95b7-c056e68a5e26"
  },
  "log": {
    "offset": 239,
    "file": {
      "path": "/home/jianghuixin/Public/Test.log"
    },
    "flags": [
      "multiline"
    ]
  },
  "message": "Traceback (most recent call last):\n  File \"Test.py\", line 1, in \n    import django\nModuleNotFoundError: No module named 'django'"
}

输出中的 fields 字段与输入配置中的 fields 保持一致

你可能感兴趣的:(#,Filebeat,filebeat,logstash)