4、Filebeat 部署与配置:从安装到输入输出,踩过的坑都在这儿了

好,咱们开始搞 Filebeat。

说实话,在 CA 日志采集这个场景里,Filebeat 是我个人最喜欢的轻量级采集器。它不像 Logstash 那么重,也不像 Fluentd 在某些配置上那么绕。但部署和配置这件事,看着简单,我遇到过不少「装上就转、但是收不到日志」的悲剧。

这一章,我不打算跟你念文档。我会把我自己踩过的坑、调优过的思路,揉进安装、输入、输出三个环节里。你照着做,基本不会出大问题。

Filebeat 部署与配置核心流程 安装 rpm / deb / 容器 输入配置 多路径 / 多类型 输出配置 Elasticsearch / Logstash filebeat.yml 核心配置来源 日志采集实战:多文件 / 实时 tail / 多行合并 保障日志不丢、不重、不乱序 个人经验:先配好输出再调输入 输出通了,输入再复杂都不怕。我以前习惯先配输入,结果输出端没通,调试了很久。

4.1 安装 Filebeat:别小看这一步

安装本身不复杂。你到 Elastic 官网去下载对应的包就行。但我得提醒你一句:版本一定要和你的 Elastic Stack 其他组件保持一致。我自己就吃过这个亏——Filebeat 7.17 连 ES 7.10,结果部分 API 不兼容,折腾了半天。

嗯,常见的安装方式就三种:

  • RPM/DEB 包:适合 CentOS、Ubuntu 这类 Linux 服务器。我个人最喜欢这种方式,好管理,卸载也干净。
  • 二进制压缩包:适合没有包管理器的场景,比如某些老系统或容器镜像。
  • 容器化:Docker 跑。如果你们已经上了 K8s,那用 DaemonSet 部署最省事。

拿 Linux 举个例:

# 导入 GPG 密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

# 添加 yum 源(RHEL/CentOS)
cat > /etc/yum.repos.d/elastic.repo << 'EOF'
[elastic-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

# 安装
yum install -y filebeat

小提示:装好后先别急着改配置。第一步看文件结构:/etc/filebeat/filebeat.yml 是主配置,/usr/share/filebeat/modules.d/ 是模块目录。先看一眼,心里有个数。

4.2 输入配置:多文件、多类型、实时采集

安装完了,就到了最核心的部分——输入配置。说白了就是告诉 Filebeat:你要抓哪些文件?怎么抓?

我记得刚开始用 Filebeat 时,以为配置里写一个 paths 就行。后来遇到一个场景:CA 系统日志分散在 /var/log/ca/、/var/log/security/、还有应用层的 /app/logs/ 里。一个 paths 搞不定。

所以 Filebeat 引入了 inputs 的概念。你可以定义多个输入,每个输入可以指定不同的路径、标签、多行合并规则。

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/ca/*.log
    - /var/log/security/*.log
  fields:
    log_type: ca_security
  multiline:
    type: pattern
    pattern: '^\d{4}-\d{2}-\d{2}'
    negate: true
    match: after

- type: container
  enabled: true
  paths:
    - /var/lib/docker/containers/*/*.log
  fields:
    log_type: container

这里有个关键点:multiline 配置。CA 系统很多日志是多行的,比如异常堆栈。如果你不配 multiline,Filebeat 默认按行切割,那一个完整事件就会被拆成好几条。我曾经看到别人排查问题时,日志被拆成碎片,根本对不上。

核心原则:输入配置要确保「一行=一个事件」,多行事件必须合并。否则下游索引出来的日志都是乱的。

多文件路径的注意事项

你可以用通配符,但别写得太宽泛。比如 /var/log/**/*.log 这种,Filebeat 会扫描所有子目录,性能会很差。我自己一般精准到 /var/log/ca/*.log 或 /app/ca*/logs/ 这种层级。

另外,**记得要排除临时或压缩文件**。比如 *.gz 或者 *.tmp,Filebeat 默认是不读的,但你也可以在 exclude_files 里手动加上,以防万一。

filebeat.inputs:
- type: log
  paths:
    - /var/log/ca/*.log
  exclude_files: ['\.gz$', '\.tmp$']

4.3 输出配置:你得先保证数据能出去

说实话,我见过太多人输入配得很花哨,结果输出端没配好,日志全堆在本地 registry 文件里,磁盘撑爆了才发现。所以我的建议是:先配输出,再调输入。

输出端最常用的就两个:Elasticsearch 直接写,或者走 Logstash 中转。

输出到 Elasticsearch

最直接,性能也最好。配置就这么几行:

output.elasticsearch:
  hosts: ["http://192.168.1.100:9200", "http://192.168.1.101:9200"]
  protocol: "https"
  username: "filebeat_user"
  password: "your_pass"
  index: "ca-logs-%{+yyyy.MM.dd}"

注意 index 名称。CA 日志可以按天建索引,方便后面清理。如果你不加 index 配置,Filebeat 会用默认的 filebeat-%{[agent.version]}-%{+yyyy.MM.dd},跟自己业务关联不大。

输出到 Logstash

适合需要额外处理或转发的场景。比如你有一个公用的 Logstash 集群,先过滤再存。

output.logstash:
  hosts: ["192.168.1.200:5044"]
  ssl.enabled: true
  ssl.certificate_authorities: ["/etc/filebeat/ca.crt"]

警告:不管是走 ES 还是 Logstash,生产环境一定要开 SSL。我见过某公司日志明文传输,结果被内网嗅探到敏感信息。Filebeat 的 SSL 配置并不难,不要偷懒。

输出端避坑指南

  • 负载均衡:如果配了多个 hosts,Filebeat 默认只连第一个,不会自动负载。你得显式加 loadbalance: true。
  • 重试机制:默认会重试,但超时时间是 30 秒。网络不稳定时可以调大一点,比如 timeout: 60。
  • 压缩:日志量大时建议开启压缩,配置 compression_level: 5,能省不少带宽。

我个人习惯:先配一个输出到本地 ES(测试环境),跑几分钟确认无错,再切换到生产输出端。

4.4 启动与验证:让日志跑起来

配置写好了,启动命令也很简单:

# 测试配置是否有语法错误
filebeat test config

# 测试输出端是否可达
filebeat test output

# 启动服务
systemctl start filebeat
systemctl enable filebeat

# 看日志是否正常
tail -f /var/log/filebeat/filebeat

这几个命令,你得当口诀来记。filebeat test config 我几乎每次改配置后都跑一遍,保命用的。

验证技巧:用 filebeat test output 能看到是否连接到 ES/Logstash、返回了哪些信息。如果输出端有问题,这一步就会有明显报错。

4.5 表格总结:输入与输出配置关键参数

配置段 关键参数 说明 个人建议值
输入(input) paths 要采集的文件路径 尽量不含泛匹配
multiline.pattern 多行合并的正则 按时间戳开头匹配
fields 自定义标签 方便下游区分来源
输出(output) hosts 目标地址列表 至少 2 个节点
index 索引命名规则 按业务名+日期
ssl.enabled 加密传输开关 true

嗯,到这一步,Filebeat 就基本跑起来了。你接下来要做的就是观察 filebeat 自己的日志,确认没有报错,然后去 ES 或者 Logstash 那头查一下,是否能搜到数据。

说白了,部署配置这件事,技术含量不算高,但细心很重要。我自己经历过最惨的一次是:配好了但没开 enabled: true,白干一上午。所以,别只看「语法没错」,还得确认「逻辑也对」。