Filebeat 安装与配置

聊到审计日志采集,Filebeat 几乎是绕不开的轻量级选手。它不像 Logstash 那么重,也不像 Fluentd 那么讲究生态。Filebeat 就是用来「把日志从 A 点搬到 B 点」的——简单、可靠、占用低。

我记得第一次用 Filebeat 是在一个 50 节点的审计项目中。当时部署完就跑了小半年,没出过大问题。嗯,下面我把安装、配置、多输入多输出这三个核心要点拆开讲。

下载与部署

Filebeat 的官方下载渠道就两个:Elastic 官网和APT/YUM 仓库。我个人习惯用压缩包部署,因为审计场景下很多服务器不允许联网安装。

下载步骤

  1. 访问 https://www.elastic.co/downloads/beats/filebeat,选对应平台(Linux、Windows、macOS)。
  2. 解压到固定目录。我一般放在 /opt/filebeat。
  3. 用 filebeat version 验证安装。
我的习惯:把下载的压缩包做一次 SHA512 比对。Elastic 官网提供了 checksum 文件,别跳过这一步——我遇到过打包下载被中间人篡改的情况(虽然几率极低)。

部署方式对比

方式优点缺点
压缩包便携、可控、离线可用手动配置 systemd 服务
APT/YUM自动解决依赖、升级方便需要网络、仓库更新滞后
Docker隔离性好、集群部署简单文件挂载权限踩坑多

说实话,我建议生产环境用压缩包 + systemd 托管。原因很简单:审计环境经常断网,APT 源配起来麻烦,而压缩包扔上去就能跑。

配置文件结构

Filebeat 的配置核心就是 filebeat.yml。说白了就是一个 YAML 文件,但它的结构逻辑稍特殊——分为三块:输入、处理、输出。每块之间通过 fields、tags、processors 串联。

我曾见过不少新手把 filebeat.inputs 和 output 混写成一层节点,导致 Filebeat 启动报错。这里必须强调:inputs 是数组,每个元素是独立输入定义;output 是单实例,但可以配置多个输出时用 output.elasticsearch + output.logstash 混搭(需配合 logging 模块)。

典型的 filebeat.yml 骨架

filebeat.inputs:
- type: filestream
  id: syslog
  paths:
    - /var/log/syslog
  fields:
    log_source: syslog

- type: container
  id: docker
  paths:
    - /var/lib/docker/containers/*/*.log

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - decode_json_fields:
      fields: ["message"]

output.elasticsearch:
  hosts: ["http://es-node1:9200", "http://es-node2:9200"]
  index: "audit-%{+yyyy.MM.dd}"
注意! filebeat.inputs 下的 id 字段必须全局唯一。我曾经因为两个输入配了相同的 id,Filebeat 直接 panic。官方文档提到这是 7.17+ 的强制要求。

关键配置项说明

配置段常用参数作用
filebeat.inputs[].typefilestream, container, syslog, tcp, stdin定义数据源类型
filebeat.inputs[].paths/var/log/*.log扫描的文件路径,支持通配符
processorsadd_host_metadata, drop_fields, decode_json在采集过程中对日志做清洗、扩充
output.elasticsearchhosts, index, username, password定义 ES 输出目标及索引策略

为什么把 processors 放在输入和输出之间?你想想看:数据从输入流进来,先经过 processors 做“预处理”,再发给输出。这个顺序是固定的,不能反向。

多输入多输出

审计场景里,一个采集节点通常要同时监控多种日志:系统日志、应用日志、容器日志,甚至审计安全事件。Filebeat 天然支持多输入,而且每个输入可以独立配置 fields 和 tags。多输出呢?Filebeat 默认只能设置一个输出,但你可以通过 output.logstash 再转发,或者在 ES 输出里配置 index 条件实现逻辑上的多索引。

我曾遇到过一个经典场景:某金融公司要求把常规审计日志写到 ES 集群 A,把安全告警日志同时写到另一个 ES 集群 B 做实时分析。他们一开始想用两个 Filebeat 进程,我建议用 Logstash 做中间桥接——Filebeat 只输出到 Logstash,Logstash 再做条件分流。这样 Filebeat 配置更清爽,维护也简单。

多输入的实战配置

filebeat.inputs:
- type: filestream
  id: system-audit
  paths:
    - /var/log/auth.log
    - /var/log/kern.log
  tags: ["system"]

- type: filestream
  id: app-audit
  paths:
    - /opt/app/logs/*.log
  fields:
    service: payment-gateway
  multiline.pattern: '^\d{4}-\d{2}-\d{2}'
  multiline.negate: true
  multiline.match: after

- type: tcp
  id: network-audit
  host: "0.0.0.0:5044"
  enabled: true

注意看第三个输入:直接监听了 TCP 5044 端口,这种适用于远程设备通过 syslog 协议发数据。嗯,记得给端口配上防火墙白名单。

多输出的两种实现方案

方案实现方式适用场景
Filebeat 单输出 + Logstash 分流Filebeat 输出到 Logstash,Logstash 按条件转发到不同 ES输出目标超过 2 个、需要复杂条件判断
Filebeat 配置多个 output(实验性)使用 output.elasticsearch 和 output.logstash 同时存在(需 logging.file 模式)测试环境、双活写入

核心原则:Filebeat 本身不是一个多功能路由器。它擅长「采集 + 简单过滤 + 可靠发送」。复杂的分流、格式转换、聚合,请交给下游的 Logstash 或 Kafka。

Filebeat 数据流全景

下面这张图我特意画了多输入多输出的数据流向。你会看到数据从不同类型的日志源进入 Filebeat,经过 harvesters 读文件、spooler 缓冲,然后通过 processors 做预处理,最终输出到不同目标。

Filebeat 多输入多输出数据流 文件日志 (filestream) 容器日志 (container) TCP/Syslog Stdin (调试) Harvester + Spool Processors 处理器 Elasticsearch Logstash / Kafka 📌 关键说明: • 多个输入共享同一个 Harvester+Spool 引擎,Filebeat 会自动管理文件指针。 • Processors 是全局的,所有输入都会经过相同的处理器链。如需差异化,请在 processors 内写条件判断。 • 输出支持弹性负载均衡(ES 集群)、SSL 加密、压缩等特性,生产务必开启。

避坑指南:我曾经把 paths 写成了相对路径,Filebeat 启动时扫不到文件。记住,路径最好用路径。另外,如果日志文件旋转特别快(比如每 5 秒钟切割一次),记得调小 scan_frequency(默认 10s)。