Filebeat 安装与配置
聊到审计日志采集,Filebeat 几乎是绕不开的轻量级选手。它不像 Logstash 那么重,也不像 Fluentd 那么讲究生态。Filebeat 就是用来「把日志从 A 点搬到 B 点」的——简单、可靠、占用低。
我记得第一次用 Filebeat 是在一个 50 节点的审计项目中。当时部署完就跑了小半年,没出过大问题。嗯,下面我把安装、配置、多输入多输出这三个核心要点拆开讲。
下载与部署
Filebeat 的官方下载渠道就两个:Elastic 官网和APT/YUM 仓库。我个人习惯用压缩包部署,因为审计场景下很多服务器不允许联网安装。
下载步骤
- 访问
https://www.elastic.co/downloads/beats/filebeat,选对应平台(Linux、Windows、macOS)。 - 解压到固定目录。我一般放在
/opt/filebeat。 - 用
filebeat version验证安装。
部署方式对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| 压缩包 | 便携、可控、离线可用 | 手动配置 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[].type | filestream, container, syslog, tcp, stdin | 定义数据源类型 |
filebeat.inputs[].paths | /var/log/*.log | 扫描的文件路径,支持通配符 |
processors | add_host_metadata, drop_fields, decode_json | 在采集过程中对日志做清洗、扩充 |
output.elasticsearch | hosts, 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 做预处理,最终输出到不同目标。
避坑指南:我曾经把 paths 写成了相对路径,Filebeat 启动时扫不到文件。记住,路径最好用路径。另外,如果日志文件旋转特别快(比如每 5 秒钟切割一次),记得调小 scan_frequency(默认 10s)。