Filebeat监控CentOS磁盘空间的实用方案
一、总体思路
- 使用 Metricbeat 采集磁盘指标(推荐):Metricbeat 自带 system 模块,可定期采集 diskio、filesystem 等指标并发送到 Elasticsearch/Kibana,用于容量与性能趋势分析与告警。
- 使用 Filebeat 读取系统日志:通过 Filebeat 收集 /var/log/messages、/var/log/secure 等系统日志,再用 Logstash/Grok 解析出磁盘相关事件(如磁盘满、I/O 错误),用于事件型告警与审计。
- 使用 脚本输出为日志:在 CentOS 上用 shell/python 定时采集 df/du/iostat 等数据,写入文件,再由 Filebeat 采集并上报,适合轻量或无法部署 Metricbeat 的场景。
二、方案一 Metricbeat采集磁盘指标(推荐)
- 安装与启用模块
- 安装 Metricbeat(与 Filebeat 同属 Beats 家族,安装方式一致)。
- 启用 system 模块并加载默认仪表板:
- 命令:sudo metricbeat modules enable system
- 导入仪表板:sudo metricbeat setup -e
- 关键配置要点(/etc/metricbeat/metricbeat.yml)
- 输出到 Elasticsearch 或 Logstash(示例为 ES):
- output.elasticsearch:
- hosts: [“your-es:9200”]
- username: “elastic”
- password: “your-password”
- 采集间隔建议:period: 10s(可按需调整)
- 验证与可视化
- 检查:sudo metricbeat test output
- 启动:sudo systemctl start metricbeat && sudo systemctl enable metricbeat
- 在 Kibana 的 Dashboard 中查看 System metrics 或 Filesystem 相关面板,配置阈值告警(如磁盘使用率 > 80%)。
- 说明
- 若使用云上托管 Elasticsearch/Logstash,可在控制台创建 Beats 采集器 并开启 Monitoring/Kibana Dashboard,降低部署复杂度。
三、方案二 Filebeat采集系统日志中的磁盘事件
- 适用场景:需要捕获“磁盘已满、I/O 错误”等离散事件,或环境中已部署 Filebeat 但未部署 Metricbeat。
- 配置示例(/etc/filebeat/filebeat.yml)
- filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/messages
- /var/log/secure
tags: [“system”, “disk”]
fields:
log_type: system
- 输出(示例到 Logstash,便于解析与丰富):
- output.logstash:
- hosts: [“your-logstash:5044”]
- Logstash 解析示例(Grok 模式可按需扩展)
- filter {
if “disk” in [tags] {
grok {
match => { “message” => “%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:host} %{DATA:program}(?:[%{POSINT:pid}])?: %{GREEDYDATA:msg}” }
}
if [msg] =~ /No space left on device/ {
mutate { add_tag => [“disk_full”] }
}
if [msg] =~ /I/O error/ {
mutate { add_tag => [“disk_io_error”] }
}
date {
match => [ “timestamp”, “MMM d HH:mm:ss”, “MMM dd HH:mm:ss” ]
}
}
}
- 在 Kibana 中创建基于 tags: disk_full 或 disk_io_error 的告警规则,实现“磁盘空间不足/异常”即时通知。
四、方案三 脚本采集+Filebeat上报(轻量替代)
- 采集脚本(示例:/usr/local/bin/disk_usage.sh)
- #!/usr/bin/env bash
ts=$(date -u +“%Y-%m-%dT%H:%M:%SZ”)
df -B1 | awk ‘NR>1 {gsub(/%/,“”,$5); printf “{"@timestamp":"%s","host":"%s","mount":"%s","used_pct":%d,"used_bytes":%d,"available_bytes":%d}\n”,ts,hostname,$6,$5,$3,$4}’ >> /var/log/disk-usage.log
- Filebeat 配置(/etc/filebeat/filebeat.yml)
- filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/disk-usage.log
json.keys_under_root: true
json.add_error_key: true
- output.elasticsearch:
- 定时任务
- */5 * * * * /usr/local/bin/disk_usage.sh
- 在 Kibana 中基于 used_pct 建立阈值告警与趋势面板。
五、避免Filebeat自身引发磁盘占满
- 日志轮转导致句柄未释放是常见问题:被删除但仍被 Filebeat 持有的文件会显示为 deleted 状态,磁盘空间不释放。
- 关键配置(在 Filebeat 输入项中按需调整):
- close_inactive: 5m(无新日志一段时间后关闭句柄,默认 5m)
- close_timeout: 3h(强制关闭未读完的文件句柄,存在潜在数据丢失风险,需评估)
- clean_inactive: 72h(清理长时间未见的文件状态,避免 registry 膨胀)
- ignore_older: 70h(仅采集最近数据,需小于 clean_inactive)
- 排查命令
- lsof | grep deleted | grep filebeat(定位被删除但仍被占用的文件)
- 建议:优先优化轮转与采集参数;若必须启用 close_timeout,务必评估对数据完整性的影响。