4、Filebeat 部署与配置:从安装到输入输出,踩过的坑都在这儿了
好,咱们开始搞 Filebeat。
说实话,在 CA 日志采集这个场景里,Filebeat 是我个人最喜欢的轻量级采集器。它不像 Logstash 那么重,也不像 Fluentd 在某些配置上那么绕。但部署和配置这件事,看着简单,我遇到过不少「装上就转、但是收不到日志」的悲剧。
这一章,我不打算跟你念文档。我会把我自己踩过的坑、调优过的思路,揉进安装、输入、输出三个环节里。你照着做,基本不会出大问题。
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,白干一上午。所以,别只看「语法没错」,还得确认「逻辑也对」。