一、Filebeat与日志存储策略概述
1.1 什么是Filebeat?
Filebeat是Elastic Stack(ELK)中的轻量级日志采集器,负责监控日志文件、收集日志数据并转发到Elasticsearch、Logstash等目的地。作为Beats家族的一员,Filebeat采用Go语言开发,资源占用极低,适合部署在边缘节点。
Filebeat核心功能:
– 监控日志文件变化(类似tail -f)
– 支持多行日志合并(如Java异常栈)
– 支持多种输出目的地(Elasticsearch、Logstash、Kafka、Redis等)
– 支持日志过滤和处理(使用processors)
– 支持至少一次交付保证(at-least-once delivery)
1.2 为什么需要日志存储策略?
在CentOS服务器上运行Filebeat时,需要制定合理的日志存储策略,原因包括:
- 磁盘空间管理:防止日志无限增长导致磁盘爆满
- 性能优化:合理的存储策略可以提升日志采集和查询性能
- 成本控制:存储大量日志成本高昂,需要制定保留策略
- 合规性要求:某些行业需要长期保存日志以满足审计要求
- 故障排查效率:合理的索引策略可以提升故障排查效率
二、Filebeat输出配置与存储策略
2.1 输出到Elasticsearch(最常用)
基本配置(/etc/filebeat/filebeat.yml):
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/messages
- /var/log/secure
output.elasticsearch:
hosts: ["localhost:9200"]
username: "filebeat"
password: "your_password"
# 索引命名策略
index: "filebeat-%{+yyyy.MM.dd}"
# 批量写入配置
bulk_max_size: 2048
worker: 2
flush_interval: 1s
# 压缩传输
compression_level: 3
按日志类型分索引:
# 使用index模板按日志类型分索引
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
output.elasticsearch:
hosts: ["localhost:9200"]
# 按日志类型分索引
indices:
- index: "filebeat-system-%{+yyyy.MM.dd}"
when.contains:
log.file.path: "/var/log"
- index: "filebeat-nginx-%{+yyyy.MM.dd}"
when.contains:
log.file.path: "/var/log/nginx"
- index: "filebeat-app-%{+yyyy.MM.dd}"
when.contains:
log.file.path: "/opt/app/logs"
2.2 输出到Logstash(推荐生产环境)
Logstash可以对日志进行过滤、转换和 enrichment,再输出到多个目的地。
Filebeat配置:
output.logstash:
hosts: ["logstash:5044"]
# 负载均衡(多个Logstash实例)
loadbalance: true
# 超时配置
timeout: 30
bulk_max_size: 2048
Logstash配置(/etc/logstash/conf.d/filebeat.conf):
input {
beats {
port => 5044
}
}
filter {
# 解析时间戳
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
}
# 解析Nginx日志
if [log][file][path] =~ "nginx" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
# 添加地理位置信息
if [clientip] {
geoip {
source => "clientip"
target => "geoip"
}
}
}
output {
# 输出到Elasticsearch
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{+yyyy.MM.dd}"
}
# 同时输出到Kafka(用于流式处理)
kafka {
bootstrap_servers => "kafka:9092"
topic_id => "logs"
}
}
2.3 输出到Kafka(流式处理场景)
Kafka适合作为日志缓冲层,解耦日志采集和日志消费。
Filebeat配置:
output.kafka:
hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]
topic: "filebeat-logs"
partition.round_robin:
reachable_only: true
required_acks: 1
compression: gzip
max_message_bytes: 1000000
消费端(Logstash)配置:
input {
kafka {
bootstrap_servers => "kafka:9092"
topics => ["filebeat-logs"]
codec => json
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "kafka-logs-%{+yyyy.MM.dd}"
}
}
三、日志保留策略与索引生命周期管理(ILM)
3.1 Elasticsearch ILM(Index Lifecycle Management)
ILM是Elasticsearch内置的索引生命周期管理功能,可以自动管理索引从创建到删除的完整生命周期。
ILM策略示例(保留30天,超过50GB自动滚动):
PUT _ilm/policy/filebeat_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "7d"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"set_priority": {
"priority": 50
},
"allocate": {
"number_of_replicas": 0
}
}
},
"cold": {
"min_age": "14d",
"actions": {
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
在Filebeat中应用ILM:
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 1
index.codec: best_compression
output.elasticsearch:
hosts: ["localhost:9200"]
ilm.enabled: true
ilm.policy_name: "filebeat_policy"
ilm.rollover_alias: "filebeat"
3.2 基于时间的索引保留策略
创建索引模板:
PUT _template/filebeat_template
{
"index_patterns": ["filebeat-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "filebeat_policy"
}
}
使用Curator工具定期删除旧索引:
# /etc/curator/action.yml
actions:
1:
action: delete_indices
description: "删除超过30天的filebeat索引"
options:
timeout_override: 300
continue_if_exception: False
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: filebeat-
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 30
添加Cron任务定期执行:
# 每天凌晨2点执行
0 2 * * * /usr/bin/curator /etc/curator/action.yml
四、本地文件存储策略
4.1 Filebeat本地注册表文件
Filebeat使用注册表文件(registry)记录已经读取的日志位置,防止重启后重复采集。
注册表文件路径:/var/lib/filebeat/registry/filebeat/
配置注册表文件:
filebeat.registry.path: "/var/lib/filebeat/registry"
filebeat.registry.file_permissions: 0644
filebeat.registry.flush: "1s"
防止注册表文件损坏:
# 定期备份注册表文件
0 3 * * * cp -rp /var/lib/filebeat/registry /backup/filebeat/registry-$(date +\%Y\%m\%d)
# 如果注册表文件损坏,可以清空让它重新采集
systemctl stop filebeat
rm -rf /var/lib/filebeat/registry
systemctl start filebeat
4.2 日志文件轮转(Log Rotation)
使用logrotate管理Filebeat自身的日志文件。
配置/etc/logrotate.d/filebeat:
/var/log/filebeat/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 root root
postrotate
/bin/kill -HUP $(cat /var/run/filebeat.pid 2>/dev/null) 2>/dev/null || true
endscript
}
4.3 本地磁盘空间监控
配置磁盘空间告警:
# Filebeat配置:当磁盘空间不足时停止采集
logging.level: info
logging.to_files: true
logging.files:
name: filebeat
path: /var/log/filebeat
keepfiles: 3
rotateeverybytes: 10485760 # 10MB
使用Cron监控磁盘空间:
# 每天检查磁盘空间,超过80%时告警
0 8 * * * df -h | awk '$NF=="/" {if ($5+0 > 80) print "磁盘空间告警:" $5 " 已使用"}' | mail -s "磁盘空间告警" admin@example.com
五、高级存储策略
5.1 使用多个输出目的地
Filebeat支持同时输出到多个目的地。
# 同时输出到Elasticsearch和文件
output.elasticsearch:
hosts: ["localhost:9200"]
index: "filebeat-%{+yyyy.MM.dd}"
output.file:
path: "/backup/logs"
filename: filebeat
rotate_every_kb: 1048576 # 1GB
number_of_files: 7
5.2 日志压缩存储
Elasticsearch端压缩:
# 使用zstd压缩(Elasticsearch 7.10+)
index.codec: zstd
# 或者使用best_compression(Elasticsearch默认)
index.codec: best_compression
Filebeat端压缩传输:
output.elasticsearch:
hosts: ["localhost:9200"]
compression_level: 3 # 1-9,越高压缩率越高但CPU消耗越大
5.3 分层存储策略
将热数据存储在SSD,温数据存储在HDD,冷数据存储在对象存储(如S3)。
Elasticsearch分层存储配置:
PUT _ilm/policy/filebeat_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50GB"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"allocate": {
"number_of_replicas": 0,
"data_tier": "warm"
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"allocate": {
"data_tier": "cold"
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
六、监控与告警
6.1 监控Filebeat状态
使用Elasticsearch监控Filebeat:
# 查看Filebeat采集状态
GET _cat/indices/filebeat-*?v
# 查看Filebeat文档数量
GET filebeat-*/_count
# 查看Filebeat采集延迟
GET filebeat-*/_search
{
"sort": [ { "@timestamp": "desc" } ],
"size": 1
}
使用Kibana监控:
- 打开Kibana → Stack Monitoring
- 查看Beats监控仪表盘
- 监控指标:采集速率、发送速率、错误率、磁盘使用量
6.2 配置告警
使用Elasticalert告警:
# /etc/elasticalert/rules/filebeat_error.yaml
name: Filebeat采集错误告警
type: frequency
index: filebeat-*
num_events: 10
timeframe:
minutes: 5
filter:
- term:
log.level: "error"
alert:
- "email"
email:
- "admin@example.com"
使用Watcher告警(Elasticsearch X-Pack):
PUT _watcher/watch/filebeat_error_watch
{
"trigger": {
"schedule": {
"interval": "5m"
}
},
"input": {
"search": {
"request": {
"indices": ["filebeat-*"],
"body": {
"query": {
"term": {
"log.level": "error"
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 10
}
}
},
"actions": {
"send_email": {
"email": {
"to": ["admin@example.com"],
"subject": "Filebeat采集错误告警",
"body": "最近5分钟内发现 {{ctx.payload.hits.total}} 个错误"
}
}
}
}
七、性能调优
7.1 Filebeat性能调优
# 调整采集并发度
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
harvester_buffer_size: 16384 # 读取缓冲区大小
max_bytes: 10485760 # 单条日志最大大小(10MB)
ignore_older: "24h" # 忽略24小时前的日志文件
# 调整发送并发度
output.elasticsearch:
hosts: ["localhost:9200"]
worker: 4 # 并行发送 worker 数量
bulk_max_size: 2048 # 批量发送大小
flush_interval: 1s # 刷新间隔
timeout: 30s # 超时时间
7.2 Elasticsearch性能调优
# elasticsearch.yml
# 调整索引刷新间隔
index.refresh_interval: "30s"
# 调整translog刷新策略
index.translog.flush_threshold_size: "1GB"
index.translog.sync_interval: "30s"
# 调整写入限流
index.store.throttle.max_bytes_per_sec: "100mb"
八、安全加固
8.1 传输加密
# Filebeat配置TLS
output.elasticsearch:
hosts: ["localhost:9200"]
protocol: "https"
ssl.enabled: true
ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
ssl.certificate: "/etc/filebeat/certs/filebeat.crt"
ssl.key: "/etc/filebeat/certs/filebeat.key"
8.2 访问控制
# 创建Filebeat专属角色
POST _security/role/filebeat_writer
{
"indices": [
{
"names": ["filebeat-*"],
"privileges": ["write", "create", "index"]
}
]
}
# 创建Filebeat用户并分配角色
POST _security/user/filebeat
{
"password": "StrongPassword123!",
"roles": ["filebeat_writer"],
"full_name": "Filebeat User"
}
九、常见问题与解决方案
Q1:Filebeat占用磁盘空间过大?
A:
1. 检查registry文件是否过大:du -sh /var/lib/filebeat/registry
2. 清理已删除的日志文件记录:filebeat -e -c /etc/filebeat/filebeat.yml -d "registry"
3. 调整日志轮转策略,及时清理旧日志
Q2:Elasticsearch磁盘空间不足?
A:
1. 检查索引大小:GET _cat/indices/filebeat-*?v
2. 删除旧索引:DELETE filebeat-2026.01.01
3. 调整ILM策略,缩短保留时间
4. 启用索引压缩:PUT filebeat-*/_settings { "index.codec": "best_compression" }
Q3:Filebeat采集延迟高?
A:
1. 检查网络延迟:ping elasticsearch-host
2. 调整Filebeat批量发送参数:bulk_max_size和flush_interval
3. 增加Elasticsearch写入性能:调整index.refresh_interval和index.translog配置
4. 使用Kafka作为缓冲层,解耦采集和写入
十、总结
在CentOS中制定Filebeat日志存储策略需要综合考虑以下方面:
- 输出目的地选择:根据业务需求选择Elasticsearch、Logstash、Kafka等
- 索引策略:按时间、按类型分索引,便于管理和查询
- 保留策略:使用ILM或Curator定期删除旧数据
- 本地存储管理:配置日志轮转、监控磁盘空间
- 性能调优:调整Filebeat和Elasticsearch参数,提升采集和写入性能
- 监控告警:实时监控Filebeat状态,及时发现问题
- 安全加固:启用TLS加密、配置访问控制
关键注意事项:
– 根据磁盘空间制定合理的保留策略
– 使用ILM自动化管理索引生命周期
– 定期监控Filebeat和Elasticsearch状态
– 为关键日志配置多个副本,防止数据丢失
– 测试恢复流程,确保可以恢复丢失的日志
通过本文的指南,你可以制定合理的Filebeat日志存储策略,确保日志数据的安全、可靠和高效存储。
注:本文基于CentOS 7/8和Filebeat 7.x/8.x编写,具体配置可能因版本差异而略有不同。