如何在Grafana中使用Loki统计特定ERROR日志消息的数量?
问题
我搭建了包含Promtail、Loki和Grafana的环境,当前正将systemd-journal日志发送至Loki。我尝试创建一个Grafana仪表盘,展示7天内日志中不同ERROR消息的计数。日志样本包含多种ERROR消息,目标是在仪表盘上按不同ERROR消息分别显示对应计数。
发送至Loki的日志片段:
2023-09-14 08:57:55 ERROR: AuthController: Login TECHNIKER: Falsches Passwort bei Local-Login 2023-09-14 08:57:35 ERROR: AuthController: Login TECHNIKER: Falsches Passwort bei Local-Login 2023-09-14 08:57:31 ERROR: AuthController: Login TECHNIKER: Falsches Passwort bei Local-Login 2023-09-14 03:39:07 ERROR: VDAI: SetErrorClass[Timeout]: Keine Verbindung nach 5 Minuten 2023-09-13 11:25:55 ERROR: No reversePort received 2023-09-13 11:25:55 ERROR: ssh failed with exitcode=255 in requestReversePortNumber() 2023-09-13 11:25:20 ERROR: No reversePort received 2023-09-13 11:25:20 ERROR: ssh failed with exitcode=255 in requestReversePortNumber() 2023-09-13 11:24:41 ERROR: No reversePort received
我目前使用的查询仅能统计过去7天所有ERROR消息的总数:
count_over_time({job="systemd-journal"} |~ `ERROR:` [7d])
预期要在仪表盘上展示的分类统计结果:
[3] ERROR: AuthController: Login TECHNIKER: Falsches Passwort bei Local-Login [1] ERROR: VDAI: SetErrorClass[Timeout]: Keine Verbindung nach 5 Minuten [3] ERROR: No reversePort received [2] ERROR: ssh failed with exitcode=255 in requestReversePortNumber()
现在需要实现按每条唯一ERROR消息展示对应计数的查询写法。
解决方案
要实现按唯一ERROR消息分类统计,需要通过LQL提取错误消息作为标签,再按标签分组统计计数,以下是两种可行方法:
方法1:使用pattern提取错误消息
适合日志格式固定的场景,直接提取ERROR:开头的整条消息作为标签:
sum by (error_message) ( count_over_time( {job="systemd-journal"} | pattern `<_> <error_message>` |~ `error_message="ERROR:.*"` [7d] ) )
pattern<_> <error_message>:忽略日志开头的时间部分,将剩余内容全部提取为error_message`标签;|~error_message="ERROR:.*"`:过滤出所有包含ERROR的消息;sum by (error_message):按提取到的错误消息分组,统计每组的总条数。
方法2:使用regexp精准提取错误消息
如果日志格式有变动,用正则表达式匹配ERROR:到行尾的内容:
sum by (error_message) ( count_over_time( {job="systemd-journal"} | regexp `^.*?(ERROR:.*)$` | label_format error_message="$1" [7d] ) )
regexp^.?(ERROR:.)$`:匹配从`ERROR:`开始到行尾的完整错误内容;label_format error_message="$1":将匹配结果赋值为error_message标签;- 最后按标签分组求和,得到每条错误消息的计数。
Grafana可视化设置
在Grafana添加面板时,推荐选择以下类型:
- Table面板:将
error_message设为一列,统计值设为另一列,直观展示每条错误的计数; - Stat面板:选择按
error_message拆分,每个错误消息单独显示对应计数。
内容的提问来源于stack exchange,提问作者Falke
相关产品推荐
相关产品推荐

