可以实现实时监控与可靠采集
工作原理与实时性
- 输入 Inputs:指定要监控的日志文件路径(支持通配符)。
- 收割机 Harvester:对每个文件持续读取新增行并送入处理链路。
- 状态管理 Registry:将每个文件的读取偏移写入磁盘注册表,重启后从断点继续,保证至少一次交付。
- 刷新频率:通过 scan_frequency 控制目录扫描与新文件发现,默认10秒;tail_files: true 可从文件尾部开始读取。
- 缓冲与发送:内部缓冲后并发发送到 Elasticsearch/Logstash 等输出端。
以上机制共同保证了在 Ubuntu 上的近实时日志采集与可靠续传。
快速配置示例 Ubuntu 20.04/22.04
- 安装 Filebeat(以 8.x 为例):
- 使用 APT:sudo apt update && sudo apt install filebeat
- 编辑配置 /etc/filebeat/filebeat.yml(仅展示关键项):
- 输入
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/myapp/*.log
tail_files: true
scan_frequency: 3s
ignore_older: 72h
close_inactive: 5m
- 输出(二选一或对接 Logstash)
output.elasticsearch:
hosts: [“localhost:9200”]
index: “filebeat-%{+yyyy.MM.dd}”
或
output.logstash:
hosts: [“127.0.0.1:5044”]
- 启动与开机自启
- sudo systemctl start filebeat
- sudo systemctl enable filebeat
- 验证
- sudo systemctl status filebeat
- 查看索引:curl -X GET “localhost:9200/_cat/indices?v”(若对接 ES)
- 查看运行日志:tail -f /var/log/filebeat/filebeat
- 如需更高实时性,可将 scan_frequency 调小(如 1–3s),注意 CPU 负载变化
日志轮转与至少一次交付
- 日志轮转不丢数据的关键参数
- close_inactive:文件在指定时间内无更新则关闭句柄,默认 5m;建议大于应用最长写入间隔。
- scan_frequency:目录扫描与新文件发现间隔,默认 10s。
- 典型轮转场景:旧文件被重命名后不再更新,close_inactive 触发关闭;scan_frequency 发现新文件并启动新的 harvester,配合注册表 offset 实现不重不漏。
- 至少一次交付与注意事项
- Filebeat 通过注册表记录事件状态,在输出阻塞或未确认时重试,重启后会重发未确认事件,确保至少一次。
- 限制与风险:若写入速度超过采集能力、输出长期不可用、或文件被删除,仍可能丢失数据;Linux 上 inode 重用 可能导致少量行被跳过(见官方 FAQ)。
常见问题与排查
- 新文件迟迟未被采集:检查 paths 通配符是否覆盖目标文件;适当降低 scan_frequency;确认文件权限与归属允许 Filebeat 读取。
- 多行堆栈被拆行:使用 multiline 正确合并多行日志(如以时间戳或异常关键字作为首行规则)。
- 从文件开头重读:删除注册表文件后重启(/var/lib/filebeat/registry 或解压安装目录下的 data/registry),谨慎操作以免影响断点续传。
- 输出阻塞或堆积:检查 Elasticsearch/Logstash 健康与吞吐,必要时增加输出并发与资源,或调整缓冲与批量参数。