前言

filebeat是一个轻量级的日志收集工具,相比logstash,功能更加单一,但是占用的资源较小,下面介绍如何使用docker来部署filebeat。更多信息请参考官方文档

拉取镜像

docker pull docker.elastic.co/beats/filebeat:7.9.2

运行Filebeat设置

运行Filebeat设置命令将创建索引模式和负载可视化,指示板和机器学习工作。运行这个命令:

docker run \
docker.elastic.co/beats/filebeat:7.9.2 \
setup -E setup.kibana.host=kibana:5601 \
-E output.elasticsearch.hosts=["elasticsearch:9200"]

在Docker上配置Filebeat

Docker映像提供了几种配置Filebeat的方法。传统的方法是通过卷挂载提供配置文件,但也可以创建包含配置的自定义映像。

示例配置文件

下载此示例配置文件作为起点:

curl -L -O https://raw.githubusercontent.com/elastic/beats/7.9/deploy/docker/filebeat.docker.yml

Volume-mounted配置

在Docker上配置Filebeat的一种方法是提供filebeat.docker.yml通过卷挂载。在docker run时,可以这样指定卷挂载。

docker run -d \
  --name=filebeat \
  --user=root \
  --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
  --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  docker.elastic.co/beats/filebeat:7.9.2 filebeat -e -strict.perms=false \
  -E output.elasticsearch.hosts=["elasticsearch:9200"]

为了防止docker重启后,filebeat的传递状态(每个文件写了多少,写到哪里)不丢失,需要把镜像的数据目录(/usr/share/filebeat/data)挂载到宿主机,更多目录布局信息请参考官方文档。(貌似还是不行)

定制配置

前面下载的filebeat.docker.yml文件被配置为基于应用于容器的Docker标签部署Beats模块。有关更多细节,请参见基于提示的自动发现。在应用Docker容器中添加标签,当部署时,Beats自动发现特性将提取标签。下面是一个Apache HTTP服务器容器的命令示例,该容器带有用于配置Apache HTTP服务器的Filebeat和Metricbeat模块的标签:

docker run \
  --label co.elastic.logs/module=apache2 \
  --label co.elastic.logs/fileset.stdout=access \
  --label co.elastic.logs/fileset.stderr=error \
  --label co.elastic.metrics/module=apache \
  --label co.elastic.metrics/metricsets=status \
  --label co.elastic.metrics/hosts='${data.host}:${data.port}' \
  --detach=true \
  --name my-apache-app \
  -p 8080:80 \
  httpd:2.4

自定义镜像配置

可以在自定义镜像中嵌入Filebeat配置。这里有一个例子Dockerfile来达到这个目的(不用操心文件权限问题):

FROM docker.elastic.co/beats/filebeat:7.9.2
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat

filebeat工作原理

Filebeat是用于转发和集中日志数据的轻量级传送器。Filebeat作为代理安装在服务器上,它监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引。

以下是Filebeat的工作原理:当您启动Filebeat时,它将启动一个或多个查找您为日志数据指定的位置的输入。对于Filebeat所定位的每个日志,Filebeat将启动一个收割机。每个收割机读取新内容的单个日志,并将新的日志数据发送到libbeat,后者聚合事件并将聚合的数据发送到为Filebeat配置的输出。

build dockerfile 日志 filebeat docker日志_docker


Filebeat由两个主要组件组成:输入和收割机。这些组件一起工作来跟踪文件并将事件数据发送到您指定的输出。

什么是收割机?

收割机负责读取单个文件的内容。收割机逐行读取每个文件,并将内容发送到输出。为每个文件启动一台收割机。收割机负责打开和关闭文件,这意味着在收割机运行时,文件描述符保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。这样做的副作用是,磁盘上的空间一直保留到收割机关闭。默认情况下,Filebeat保持文件打开,直到达到close_inactive

关闭一个收割机具有以下后果:

  • 文件处理程序关闭,如果文件在收割机仍在读取文件时被删除,则释放底层资源。
  • 只有在scan_frequency结束之后,才会再次启动文件的收集。
  • 如果该文件在收割机关闭时被移动或删除,该文件的收集将不会继续。

要控制收割机何时关闭,使用close_*配置选项。

什么是输入?

一个输入负责管理收割机和寻找所有来源读取。

如果输入类型是log,则输入将查找驱动器上与定义的glob路径匹配的所有文件,并为每个文件启动一个收割机。每个输入在它自己的Go例程中运行。

下面的示例将Filebeat配置为从所有与指定的glob模式匹配的日志文件中获取行:

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

Filebeat目前支持几种输入类型。每个输入类型都可以定义多次。日志输入检查每个文件,以查看是否需要启动收割机、收割机是否已经在运行,或者是否可以忽略该文件(参见ignore_older)。只有在关闭收割机后文件大小发生变化时才会拾取新行。

Filebeat如何保存文件的状态?

Filebeat保存每个文件的状态,并经常将该状态刷新到注册表文件中的磁盘。该状态用于记住收割机读取的最后一个偏移量,并确保发送了所有日志线。如果不能访问Elasticsearch或Logstash等输出,Filebeat将跟踪最后发送的行,并在输出再次可用时继续读取文件。当Filebeat运行时,每个输入的状态信息也保存在内存中。当重新启动Filebeat时,将使用来自注册表文件的数据重新构建状态,Filebeat将在最后已知的位置继续每个收割机。

对于每个输入,Filebeat保存它找到的每个文件的状态。因为文件可以重命名或移动,所以文件名和路径不足以识别文件。对于每个文件,Filebeat存储唯一标识符,以检测之前是否收集了文件。

如果您的用例每天都要创建大量的新文件,那么您可能会发现注册表文件变得太大了。有关可设置以解决此问题的配置选项的详细信息,请参阅“注册表文件太大”。

Filebeat如何确保最少一次传递?

Filebeat保证事件将至少一次传递到配置的输出,并且不会丢失数据。Filebeat能够实现此行为,因为它将每个事件的传递状态存储在注册表文件中。

在定义的输出被阻塞且没有确认所有事件的情况下,Filebeat将继续尝试发送事件,直到输出确认已接收到事件为止。

如果Filebeat在发送事件的过程中关闭,它在关闭之前不会等待输出确认所有事件。当重新启动Filebeat时,将再次发送发送到输出中但在Filebeat关闭前未确认的任何事件。这可以确保每个事件至少发送一次,但最终可能会将重复的事件发送到输出。通过设置shutdown_timeout选项,可以配置Filebeat在关闭之前等待特定的时间。

Filebeat的至少一次传递保证有一个限制,涉及到日志旋转和旧文件的删除。如果日志文件被写入磁盘并旋转的速度比Filebeat处理它们的速度快,或者在输出不可用时删除了文件,那么数据可能会丢失。在Linux上,由于inode重用,Filebeat也可以跳过行。有关inode重用问题的详细信息,请参阅常见问题

filebeat配置

完整的配置选项,请参考官方文档

读取日志文件并发送到es

最简单的一个例子是读取日志文件并发送到elasticsearch:

filebeat.inputs:
    - type: log
      paths:
        - /usr/share/filebeat/logs/level0.json
output.elasticsearch:
  hosts: ["http://elasticsearch:9200"]