通过Ubuntu Filebeat实现日志告警的核心流程
Filebeat本身不具备告警功能,需结合Elastic Stack(Elasticsearch、Kibana)的Watcher(或X-Pack Alerting)组件实现。以下是详细步骤:
安装Elastic Stack组件
在Ubuntu上安装Filebeat、Elasticsearch、Kibana(版本需兼容,建议使用7.x及以上):
sudo apt-get update
sudo apt-get install filebeat elasticsearch kibana
sudo systemctl enable --now elasticsearch kibana filebeat
配置Filebeat采集日志
编辑/etc/filebeat/filebeat.yml,指定日志路径(如系统日志、应用日志)并输出到Elasticsearch:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log # 监控所有系统日志
- /opt/app/logs/*.log # 应用自定义日志路径(按需调整)
output.elasticsearch:
hosts: ["localhost:9200"] # Elasticsearch地址
sudo filebeat modules enable system
sudo filebeat setup # 初始化模块(加载默认仪表盘)
验证数据采集
登录Kibana(默认地址http://localhost:5601),进入Stack Management → Index Patterns,创建filebeat-*索引模式,确认日志数据已成功索引。
Watcher是Elasticsearch的原生告警工具,用于定义触发条件和通知动作。以下以“检测错误日志并发送邮件”为例:
/etc/elasticsearch/elasticsearch.yml,开启Watcher:xpack.watcher.enabled: true
sudo systemctl restart elasticsearch
通过Kibana的Dev Tools(控制台)或直接发送HTTP请求创建规则。以下示例每分钟检查filebeat-*索引中的ERROR日志,若数量超过0则发送邮件:
PUT _watcher/watch/filebeat_error_alert
{
"trigger": {
"schedule": {
"interval": "1m" // 检测频率(每分钟)
}
},
"input": {
"search": {
"request": {
"indices": ["filebeat-*"],
"body": {
"query": {
"bool": {
"must": [
{ "range": { "@timestamp": { "gte": "now-1m", "lte": "now" } } }, // 最近1分钟的数据
{ "term": { "log.level": "ERROR" } } // 筛选ERROR级别的日志
]
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": { "gt": 0 } // 错误数>0时触发
}
},
"actions": {
"send_email": {
"email": {
"to": "admin@example.com", // 接收邮箱
"subject": "【告警】Filebeat检测到ERROR日志",
"body": "检测到{{ctx.payload.hits.total}}条ERROR日志,请及时处理。\n\n详情:\n{{#ctx.payload.hits.hits}}• {{_source.message}}\n{{/ctx.payload.hits.hits}}"
}
}
}
}
/var/log/test.log):echo "[ERROR] This is a test error log" | sudo tee -a /var/log/test.log
admin@example.com是否收到告警邮件。Watcher支持多种通知方式(邮件、Slack、PagerDuty等),需提前配置SMTP或集成第三方服务。以下以邮件通知为例:
编辑/etc/elasticsearch/elasticsearch.yml,添加SMTP配置:
xpack.notification.email:
account:
default:
smtp:
host: "smtp.example.com" # SMTP服务器地址(如QQ邮箱:smtp.qq.com)
port: 587
user: "your_email@example.com"
password: "your_email_password"
protocol: "smtp"
auth: "plain"
from: "your_email@example.com" # 发件人地址
to: "admin@example.com" # 收件人地址(可多个,用逗号分隔)
sudo systemctl restart elasticsearch
修改Watcher规则中的actions部分,使用上述SMTP配置,触发告警后检查邮箱是否收到通知。
复杂告警条件
使用DSL查询实现多维度筛选(如结合log.source、user.id等字段):
"query": {
"bool": {
"must": [
{ "range": { "@timestamp": { "gte": "now-5m", "lte": "now" } } },
{ "term": { "log.level": "ERROR" } },
{ "term": { "service.name": "payment-service" } } // 特定服务的错误
]
}
}
集成第三方通知
actions中配置slack类型并填写Webhook URL。性能调优
interval: "5m"减少资源消耗)。filter缩小查询范围(如仅监控特定索引):"input": {
"search": {
"request": {
"indices": ["filebeat-*"],
"body": {
"query": {
"bool": {
"must": [
{ "range": { "@timestamp": { "gte": "now-1m", "lte": "now" } } },
{ "term": { "log.level": "ERROR" } },
{ "term": { "kubernetes.pod.name": "nginx-pod" } } // Kubernetes环境下的Pod过滤
]
}
}
}
}
}
}
安全管理
xpack.security.transport.ssl.enabled: true)。GET _watcher/stats)、查询条件是否正确(通过Kibana Dev Tools手动执行查询验证)。watcher和email权限(通过Kibana的Stack Management → Roles设置)。通过以上步骤,即可在Ubuntu上通过Filebeat结合Elastic Stack实现日志告警,覆盖从日志采集到告警通知的全流程。