在 Ubuntu 上,Filebeat 本身不支持“手动重发已经采集过的数据”,因为它的设计是一次读取、按位置(offset)推进。所谓“重发数据”,通常是通过让 Filebeat 重新读取日志文件来实现。
下面按常见场景说明做法。
Filebeat 通过 registry 文件记录已读取位置:
/var/lib/filebeat/registry
只要删除或清理 registry,Filebeat 就会从头重新读日志。
sudo systemctl stop filebeat
sudo mv /var/lib/filebeat/registry /var/lib/filebeat/registry.bak
sudo mkdir /var/lib/filebeat/registry
sudo systemctl start filebeat
✅ 效果:所有被监控的日志会重新发送一次
如果日志文件被 truncate(> file.log),Filebeat 可能不会重读。
解决方式:
sudo mv app.log app.log.old
sudo touch app.log
然后让程序继续写 app.log
⚠️ 这样
app.log.old不会再被监控
clean_* 参数(推荐)编辑 /etc/filebeat/filebeat.yml:
filebeat.inputs:
- type: log
paths:
- /var/log/app/*.log
clean_removed: true
clean_inactive: 1h
然后:
sudo systemctl restart filebeat
✅ 只能重新读日志文件 (Filebeat 不保存已发数据副本)
如果日志已轮转删除:
log rotation + 保留策略sudo systemctl stop filebeat
sudo rm -rf /var/lib/filebeat/registry
sudo systemctl start filebeat
filebeat.registry.flush: 1s
queue.mem:
events: 4096
并确保:
copytruncate| 需求 | 做法 |
|---|---|
| 全部重发 | 删除 registry |
| 单文件重发 | rotate / 新文件 |
| 已发数据补发 | 不可能(需重读日志) |
| 防止重复 | 不要删 registry |
如果你能说明:
我可以给你更精确的操作方案。