如何在Grafana告警通知中包含完整错误日志(含Loki及替代方案)
用Loki+Grafana实现带完整错误日志的告警配置
先明确核心问题
你用的count_over_time只能返回错误日志的数量,拿不到具体日志内容,所以告警得拆成两步:先用计数判断要不要触发告警,再在通知模板里单独查一遍对应的错误日志。
具体配置步骤
1. 先建告警触发规则
- 进入Grafana的「Alerting」→「Alert rules」→「New alert rule」
- 选择Loki数据源,输入查询语句:
(时间范围别用1s,容易误触发,改成1m或者5m更合理,可根据实际需求调整)count_over_time({app="some-application"} |= "ERROR" [1m]) > 0 - 配置触发条件:比如「For」设为10s,确保错误不是一闪而过的偶发情况再触发告警
- 填写告警名称、选择所属文件夹,保存规则
2. 配置通知模板拉取完整日志
Grafana的通知模板需要利用告警携带的标签(比如app名称),再去Loki查询具体日志:
- 进入「Alerting」→「Notification policies」,找到你使用的通知渠道点击「Edit」
- 在「Message template」中添加自定义模板,示例如下:
注意:模板里的时间范围要和告警规则里的完全一致,否则可能查不到对应日志;如果告警规则里还有其他标签(比如{{ define "error_alert_with_logs" }} 【告警触发】应用 {{ .Labels.app }} 出现错误日志 --- 错误日志详情: {{ range query "{app=\"{{ .Labels.app }}\"} |= \"ERROR\" [1m]" | log_entries }} {{ .Line }} {{ end }} {{ end }} {{ template "error_alert_with_logs" . }}env),也要同步加到模板的查询语句中。 - 保存通知渠道配置
3. 测试验证
- 让应用故意生成一条ERROR级日志
- 等待告警触发后,检查通知内容是否包含完整的错误日志
如果上述模板无效,试试简化版直接嵌入通知内容:
应用 {{ $labels.app }} 错误告警: {{ range query "{app=\"{{ $labels.app }}\"} |= \"ERROR\" [1m]" | log_entries }} {{ .Line }} {{ end }}
若Loki不适用,可选择这些替代工具
1. ELK Stack(Elasticsearch+Logstash+Kibana)
- 配置步骤:
- 用Filebeat或Logstash将应用日志同步到Elasticsearch
- 在Kibana中创建告警规则:设置查询条件
app:some-application AND level:ERROR,触发条件为“计数大于0” - 在告警通知模板中直接引用日志的
_source.message字段,即可带上完整日志内容
- 优势:生态成熟,支持复杂的日志查询和灵活的告警配置
2. Promtail+Loki+Alertmanager(绕开Grafana模板)
- 若Grafana模板不好用,可直接用Alertmanager处理:
- 在Loki的配置文件中添加告警规则,通过
expr判断错误计数,然后在annotations中调用Loki API查询对应日志 - 在Alertmanager的通知模板中解析
annotations里的日志内容并展示
- 在Loki的配置文件中添加告警规则,通过
3. Datadog Logs
- 配置步骤:
- 安装Datadog Agent采集应用日志
- 创建监控:设置日志查询
service:some-application @level:ERROR,触发条件为“5分钟内出现日志” - 通知中勾选「Include sample logs」选项,自动附带完整错误日志
常见问题排查
- 模板查不到日志:检查Loki数据源权限,确保Grafana可执行日志查询;核对标签匹配度(比如app名称的引号、大小写是否完全一致)
- 通知内容为空:确认告警规则的触发条件是否正确,是否真的产生了错误日志;调整时间范围,避免查询范围过大或过小
内容的提问来源于stack exchange,提问作者Ivan Selianto
相关产品推荐
相关产品推荐

