我们经常遇到这样的场景:**生产环境系统出问题了,日志早就写好了报错信息,但团队没人知道。**系统看起来“运行正常”,其实用户早就被 Bug 打败了。这篇文章会从实战角度出发,介绍如何将日志系统与告警通道打通:让日志真正“叫得出声”,第一时间触发钉钉、邮箱、短信等渠道告警。
随着微服务架构的普及,一个用户请求背后可能跨越十几个服务节点。我们在每个节点记录日志,但如果没有统一的监控和告警机制,这些日志就像写在墙上的涂鸦——没人看,也没人管。
现代的日志系统已经不再是“写到文件里就完事”,它应该是系统可观测性的一部分。我们可以通过:
下面,我们从简单到复杂,逐一讲解实现方式。
Watcher 是 Elasticsearch 的一款 X-Pack 插件,用于监控数据变动并触发行为。可以设定日志字段中的关键字(如“ERROR”、“OutOfMemory”),超过阈值或出现即触发告警。
PUT _watcher/watch/error_alert_watch
{
"trigger": {
"schedule": {
"interval": "1m"
}
},
"input": {
"search": {
"request": {
"indices": ["logstash-*"],
"body": {
"query": {
"match": {
"message": "ERROR"
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total.value": {
"gt": 0
}
}
},
"actions": {
"send_email": {
"email": {
"to": "ops@example.com",
"subject": "日志告警:发现 ERROR 日志",
"body": "请检查系统日志,发现 ERROR 报错。"
}
}
}
}
Loki 是 Grafana 推出的日志系统,支持 PromQL 查询语法,轻量级、原生支持日志与指标结合,配合 Alertmanager 可直接推送钉钉、微信、邮件等。
Promtail 收集日志 → Loki 聚合 → Alertmanager 告警
groups:
- name: error-logs
rules:
- alert: AppErrorLog
expr: count_over_time({job="app"} |= "ERROR"[1m]) > 0
for: 1m
labels:
severity: warning
annotations:
summary: "发现 ERROR 日志"
description: "服务出现错误日志,请立即检查。"
receivers:
- name: dingtalk
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
可以结合 Webhook 转换器(如 dingtalk-webhook-adapter)将 Prometheus 告警转为钉钉格式。
适用于日志量超大、不适合用全文索引系统查询的情况,比如:
const { Kafka } = require('kafkajs');
const axios = require('axios');
const kafka = new Kafka({ clientId: 'log-alert', brokers: ['localhost:9092'] });
const consumer = kafka.consumer({ groupId: 'log-alert-group' });
(async () => {
await consumer.connect();
await consumer.subscribe({ topic: 'logs', fromBeginning: false });
await consumer.run({
eachMessage: async ({ message }) => {
const log = message.value.toString();
if (log.includes('ERROR') || log.includes('OutOfMemory')) {
await axios.post('https://oapi.dingtalk.com/robot/send?access_token=xxx', {
msgtype: 'text',
text: { content: `日志告警:${log}` }
});
}
},
});
})();
支付服务日志中记录了一个字段 payment_status = failed
,但因为日志没被及时处理,业务侧连续丢单 20 分钟。
count_over_time({app="payment"} |= "payment_status=failed"[5m]) > 10
A: 可以通过设置 抖动时间(for: 5m)、分组告警(group_by)、聚合告警(count > N) 降低骚扰频率。
A: 可以。ELK 中 watcher 动作支持引用字段,Loki 支持 line_format
,Kafka 消费者也可以截取关键字段作为告警内容。
A: 可以通过正则或标签过滤,比如:
{job!="dev"} |= "ERROR"
避免开发环境日志触发告警。
日志不止用来看,更重要的是“能触发”,也就是我们说的日志驱动告警系统。只要你把日志打得够规范,后续无论是用 Watcher、Loki 还是 Kafka,都能帮你实现实时响应的问题发现体系。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。