在 CentOS 上运行 Filebeat 丢数据(丢日志) 是比较常见的问题,通常不是 Filebeat“随机丢”,而是某些机制或配置导致未被采集 / 被覆盖 / 被限流 / 被丢弃。下面按最常见原因 → 排查方式 → 解决办法来说明。
典型场景
logrotate表现
解决
logrotate 时,不要用 copytruncate# 不推荐
/var/log/app/*.log {
copytruncate
}
/var/log/app/*.log {
daily
missingok
notifempty
create 0644 app app
}
Filebeat 配置确保:
filebeat.inputs:
- type: log
paths:
- /var/log/app/*.log
scan_frequency: 1s
原理
Filebeat 用 registry 记录“读到哪了”
常见问题
/var/lib/filebeat/registry 被删表现
解决
-v /data/filebeat/registry:/usr/share/filebeat/data
典型配置问题
output.elasticsearch:
hosts: ["http://es:9200"]
未配置 queue
后果
drop 事件日志特征
queue is full, dropping event
解决(强烈建议)
queue.mem:
events: 4096
flush.min_events: 512
flush.timeout: 5s
或使用磁盘队列(生产推荐):
queue.disk:
path: /var/lib/filebeat/diskqueue
max_size: 10GB
错误示例
echo "log" > app.log # 覆盖
Filebeat 只监控 inode + offset
解决
echo "log" >> app.log
表现
解决
典型问题
multiline.pattern: '^\['
multiline.match: after
配置错误导致:
解决
timeoutmultiline.timeout: 5s
CentOS 常见:
检查
journalctl -u filebeat
dmesg | grep filebeat
# 1. 是否有 drop 日志
journalctl -u filebeat | grep -i drop
# 2. registry 是否异常
ls -lh /var/lib/filebeat/registry
# 3. 文件是否 append
lsof | grep filebeat
# 4. 输出是否慢
filebeat test output
filebeat.inputs:
- type: log
paths:
- /var/log/app/*.log
scan_frequency: 1s
close_inactive: 5m
ignore_older: 24h
queue.disk:
path: /var/lib/filebeat/diskqueue
max_size: 10GB
output.elasticsearch:
hosts: ["http://es:9200"]
bulk_max_size: 2048
你可以补充:
我可以直接帮你看配置 + 给最小修复方案。