二、Filebeat

可以使用 Filebeat 收集各种日志,之后发送到指定的目标系统上,但是同一时间只能配置一个输出目标。

Filebeat 会对配置好的日志内容进行收集,第一次会从每个文件的开头一直读到当前文件的最后一行。

每一行称为一个事件,格式是一个包含很多字段的大字典,也就是 JSON 格式的数据。在 Filebeat中负责完成这个动作的官方称它为 Harvester (收割机)。

每个事件将来会被保存到 Elasticsearch 中

在收割机读到文件的最后,会停止工作。直到文件有新的内容写入才继续工作。
在这里插入图片描述

1. Filebeat安装

# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.2-linux-x86_64.tar.gz
# tar xzvf filebeat-7.13.2-linux-x86_64.tar.gz  -C /usr/local/
# mv /usr/local/filebeat-7.13.2-linux-x86_64  /usr/local/filebeat

Filebeat启动管理

1.前台运行

采用前台运行的方式查看Filebeat获取的日志结果

# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml

2.后台运行

使用nohup方式启动Filebeat到后台,日志结果可查看nohup.out文件

使用systemd管理的后台方式启动Filebeat进程不能查看输出日志,测试阶段勿用

配置systemd方式的Filebeat启动管理文件

# vim /usr/lib/systemd/system/filebeat.service
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Wants=network‐online.target
After=network‐online.target
[Service]
User=root
Group=root
Environment="BEAT_CONFIG_OPTS=-c /usr/local/filebeat/filebeat.yml"
ExecStart=/usr/local/filebeat/filebeat $BEAT_CONFIG_OPTS
Restart=always
[Install]
WantedBy=multi‐user.target


# systemctl daemon-reload
# systemctl start  filebeat

另一种写法:

# vim /usr/local/lib/systemd/system/filebeat.service
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/filebeat/filebeat  -c /usr/local/filebeat/filebeat.yml
Restart=always

[Install]
WantedBy=multi-usr.target

# systemctl daemon-reload
# systemctl start filebeat
# systemctl stop filebeat

2. Filebeat简单使用

准备测试数据

# vim /tmp/access.log
123.127.39.50 - - [04/Mar/2021:10:50:28 +0800] "GET /logo.jpg HTTP/1.1" 200 14137 "http://81.68.233.173/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36" "-"

配置Filebeat的输入和输出

# vim /usr/local/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true  #改
  paths:  
    - /tmp/*.log #改 指定需要收集日志的路径,支持通配符可以写多个
filebeat.config.modules: # 内置的收集日志的模块配置文件的存放路径
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false  # 当模块的配置文件有更新时,此程序是否要自动加载,false不加载,true 加载
setup.template.settings:
  index.number_of_shards: 1

output.console:  #添加 输出到终端即屏幕上
  pretty: true

# 输出到 logstash
#output.logstash:
  #  logstash 的 IP和端口
  #hosts: ["172.26.139.148:5044"]
processors: #改
  - add_host_metadata:  # 添加此主机的源数据信息到输出数据中,比如 IP MAC OS 等信息
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

运行观察输出

# /usr/local/filebeat/filebeat   -c /usr/local/filebeat/filebeat.yml
{
  "@timestamp": "2021-06-23T12:19:42.365Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.13.2"
  },
  "ecs": {
    "version": "1.8.0"
  },
  "host": {
    "architecture": "x86_64",
    "os": {
      "type": "linux",
      "platform": "centos",
      "version": "8",
      "family": "redhat",
      "name": "CentOS Stream",
      "kernel": "4.18.0-294.el8.x86_64"
    },
    "id": "3d840c2596ce432e97b53dc4c13238d4",
    "containerized": false,
    "ip": [
      "192.168.19.100",
      "fe80::20c:29ff:fe94:e2e1"
    ],
    "mac": [
      "00:0c:29:94:e2:e1",
      "52:54:00:42:a0:5f",
      "52:54:00:42:a0:5f"
    ],
    "name": "filebeat",
    "hostname": "filebeat"
  },
  "log": {
    "offset": 0,
    "file": {
      "path": "/tmp/access.log"
    }
  },
  "message": "123.127.39.50 - - [04/Mar/2021:10:50:28 +0800] \"GET /logo.jpg HTTP/1.1\" 200 14137 \"http://81.68.233.173/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36\" \"-\"",
  "input": {
    "type": "log"
  },
  "agent": {
    "ephemeral_id": "576ab73f-c1ce-45eb-9fde-1e6652b997ef",
    "id": "eccd15f4-43d5-445d-bc88-08433419b771",
    "name": "filebeat",
    "type": "filebeat",
    "version": "7.13.2",
    "hostname": "filebeat"
  }
}

找不到配置文件可使用-c指定配置文件位置

./filebeat -c /usr/local/filebeat/filebeat.yml

Filebeat进程日志

filebeat本身运行日志默认位置 /usr/local/filebeat/logs/filebeat

要修改Filebeat的日志路径,可以添加如下内容在配置文件 filebeat.yml 中实现

# ================================== Logging ===================================

# Sets log level. The default log level is info.
# Available log levels are: error, warning, info, debug
#logging.level: debug
path.logs: /var/log/   #添加此行即可

这样设置后,filebeat 启动后,日志的目录是 /var/log/, 日志的文件名为 filebeat ,每次启动或者重启程序会生成一个新的日志文件 filebeat, 旧的日志命名为 filebeat.1 依次类推。

3. 专用日志搜集模块

查看可启用的模块列表

# /usr/local/filebeat/filebeat modules list
Enabled:

Disabled:
activemq
apache
auditd
aws
...
...

模块配置文件存储位置

[root@filebeat modules.d]# pwd
/usr/local/filebeat/modules.d

[root@filebeat modules.d]# ls
activemq.yml.disabled       f5.yml.disabled                misp.yml.disabled             
..
..

禁用模块

/usr/local/filebeat/filebeat modules disable 模块名

​ 例如:

# 方式一:
/usr/local/filebeat/filebeat modules enable nginx
# 方式二:指定filebeat.yml文件路径
/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml  modules enable nginx

启用模块

/usr/local/filebeat/filebeat modules enable 模块名

4. 示例模块-Nginx模块

准备Nginx示例日志

访问日志示例文件

# vim /var/log/access.log
123.127.39.50 - - [04/Mar/2021:10:50:28 +0800] "GET /logo.jpg HTTP/1.1" 200 14137 "http://81.68.233.173/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36" "-"

错误日志示例文件

# vim /var/log/error.log
2021/03/04 10:50:28 [error] 11396#0: *5 open() "/farm/bg.jpg" failed (2: No such file or directory), client: 123.127.39.50, server: localhost, request: "GET /bg.jpg HTTP/1.1", host: "81.68.233.173", referrer: "http://81.68.233.173/"

启用 nginx 模块

./filebeat modules enable  nginx

# 方式二:指定filebeat.yml文件路径
/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml  modules enable nginx

情景1:使用模块默认的日志路径

修改 modules.d/nginx.yml 文件内容如下:

vim /usr/local/filebeat/modules.d/nginx.yml
- module: nginx
  access:
    enabled: true
  error:
    enabled: true

nginx 模块搜集日志的默认路径是:

  • /var/log/nginx/access.log*
  • /var/log/nginx/error.log*

情景2:使用非默认路径(适用于所有的模块)

假如所要搜集的日志真实路径和日志收集模块默认的路径不一致,可以配置 var.paths: 属性进行配置。

var.paths

​ 接收的值是一个包含一个以上的日志绝对路径列表。接收的值是一个数组

​ 用于给日志文件设置自定义路径的。如果不设置此选项,Filebeat将根据您的操作系统选择路径选择使用默认值

可以使用如下方式配置:

- module: nginx
  access:
    enabled: true
    var.paths: ["/opt/nginx/log/nginx/access.log*", "/opt/nginx/log/error.log*"]

或者下面的方式:

- module: nginx
  access:
    enabled: true
    var.paths:
      - "/opt/nginx/log/nginx/access.log*"
      - "/opt/nginx/log/error.log*"    

⚠️ 注意:
var.paths 指定的路径,是以追加的方式和模块默认路径合并到一起的,也就是说假如模块的默认路径有具体的日志文件 /var/log/nginx/access.log
这里 var.paths 也配置了路径 /tmp/accesslog ,那么最终 Filebeat 收集的日志路径将会是:

  • /var/log/nginx/access.log
  • /tmp/accesslog

测试:调用模块进行测试:./filebeat -e

配置output

Filebeat 是用于搜集日志,之后把日志推送到某个接收的系统中的,这些系统或者装置在 Filebeat 中称为 output

output类型:

  • console 终端屏幕
  • elasticsearch 存放日志,并提供查询
  • logstash 进一步对日志数据进行处理
  • kafka 消息队列

完整output列表Filebeat 的官方文档

⚠️filebeat 运行的时候,以上的 output 只可配置其中的一种。

具体配置方式是编辑主配置文件 :
/usr/local/filebeat/filebeat.yml

注意:注释掉其他的 output

输出到 console

输出完整 JSON 数据

output.console:
  pretty: true

进入到 filebeat 的安装目录下,执行命令前台运行

./filebeat

如果只想输出完整Json数据中的某些字段

output.console:
  codec.format:
    string: '%{[@timestamp]} %{[message]}'

其他输出目标:

输出到 elasticsearch

output.elasticsearch:
  hosts: ['http://es01:9200', 'http://es02:9200']

更多关于 Elasticsearch 的配置参考官方文档

输出到 logstash

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

5. 重读日志文件

有时候处于实验目的,可能需要重新读取日志文件,这个时候需要删除安装目录下的 data 文件夹,重新运行 filebeat 即可。
在这里插入图片描述

报错

假如出现如下报错,请删除安装目录中的 data 文件夹

Exiting: data path already locked by another beat. Please make sure that multiple beats are not sharing the same data path (path.data).

查看一下是否有一个进程已经处于运行状态,尝试杀死此进程,之后重新运行 filebeat

[root@qq filebeat]# ps -ef |grep 'filebea[t]'
root      9156     1  1 1月26 ?       08:50:04 ./filebeat
[root@qq filebeat]#

6. 使用Processors(处理器)过滤和增强数据(扩展部分)

可以在配置中定义处理器,以便在事件发送到配置的输出之前对其进行处理。libbeat库提供以下处理器:

  • 减少导出字段的数量
  • 使用其他元数据增强事件
  • 执行其他处理和解码

工作方式

每个处理器都接收一个事件,对该事件应用已定义的操作,然后返回该事件。如果定义处理器列表,则将按照在Filebeat配置文件中定义的顺序执行它们。

去重日志中的某些行

配置位置在 filebeat.yml 文件中

删除所有以 DBG: 开头的行

processors:
  - drop_event:
      when:
        regexp:
          message: "^DBG:"  # message为自定义字段
# 在/var/log/access.log中添加内容 “ABC”
echo ABC >> /var/log/access.log 

向输出的数据中添加某些自定义字段

processors:
  - add_fields:
      target: project  # 要添加的自定义字段key名称
      fields:
        name: myproject
        id: '574734885120952459'

输出效果如下图所示:
在这里插入图片描述

从事件中删除某些字段

processors:
  - drop_fields:
      fields: ["field1", "field2", ...]
      ignore_missing: false

以上配置,将删除字段: field1field2

ignore_missing 的值为 false 表示,字段名不存在则会返回错误。为 true 不会返回错误。

⚠️ 注意: 事件中的 "@timestamptype 字段是无法删除的。

下面的配置示例是删除顶级字段 input 和 顶级字段 ecs 中的 version 字段。

  - drop_fields:
     fields: ['input', "ecs.version"]

删除之前⬇️

{
  ...
  "input": {
    "type": "log"
  },
  ...
  "ecs": {
    "version": "1.5.0"
  },
  ...
}

删除之后⬇️

{
  ...
  "ecs": {},
  ...
}

elds: [“field1”, “field2”, …]
ignore_missing: false


以上配置,将删除字段: `field1` 和 `field2`

`ignore_missing` 的值为 `false` 表示,字段名不存在则会返回错误。为 `true` 不会返回错误。


⚠️ 注意: 事件中的 `"@timestamp` 和 `type` 字段是无法删除的。

下面的配置示例是删除顶级字段 `input` 和 顶级字段 `ecs` 中的 `version` 字段。

  • drop_fields:
    fields: [‘input’, “ecs.version”]

**删除之前**⬇️

{

“input”: {
“type”: “log”
},

“ecs”: {
“version”: “1.5.0”
},

}


**删除之后**⬇️

{

“ecs”: {},

}


官方完整的处理器列表:[**点我查看目前支持的所以处理器列表**](https://www.elastic.co/guide/en/beats/filebeat/current/defining-processors.html)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐