基于Loki构建日志数量统计Grafana仪表盘的技术咨询
基于Loki构建日志数量统计Grafana仪表盘的技术咨询
当然可以实现!完全不用依赖Prometheus的metrics,用Loki自带的查询语言(LQL)就能搞定,而且因为你的日志是结构化JSON格式,还能做精准的字段过滤,下面一步步给你拆解:
一、核心LQL查询写法
你的日志是标准JSON结构,Loki支持直接解析JSON字段来做精准过滤,比字符串匹配更可靠,避免误匹配。针对不同日志级别,对应的统计查询如下:
按时间统计单级别日志量(时间序列图用)
这是最基础的查询,用来展示每个级别日志随时间的变化趋势:
- INFO日志:
count_over_time({name="mycoolapp"} | json | level="INFO" [$__interval]) - ERROR日志:
count_over_time({name="mycoolapp"} | json | level="ERROR" [$__interval]) - WARN日志:
count_over_time({name="mycoolapp"} | json | level="WARN" [$__interval]) - DEBUG日志:
count_over_time({name="mycoolapp"} | json | level="DEBUG" [$__interval])
每个部分的作用:
{name="mycoolapp"}:先通过标签过滤指定你的应用日志,这一步很重要,能大幅缩小查询范围,提升性能| json:告诉Loki把日志内容解析成JSON字段level="INFO":精准过滤出level字段为INFO的日志count_over_time(...) [$__interval]:按Grafana自动适配的时间间隔,统计每个时间窗口内的日志数量
统计多级别日志总数(统计面板用)
如果想在一个面板里展示所有级别的日志总数,可以用分组统计:
sum(count_over_time({name="mycoolapp"} | json | level=~"INFO|ERROR|WARN|DEBUG" [$__interval])) by (level)
这个查询会自动按level分组,返回每个级别的日志总量。
二、Grafana仪表盘配置步骤
- 确认Loki数据源:先确保你的Grafana已经添加并配置好了Loki数据源,能正常连接到你的Loki实例
- 新建时间序列面板:这是用来模拟你之前用Prometheus的那种趋势图的核心面板
- 依次添加上面的4个单级别查询
- 给每个查询设置别名(比如把第一个查询的别名改成「INFO日志数」),这样图表的图例会更清晰
- 调整图表样式:比如设置线条颜色区分不同级别(比如ERROR用红色),开启图例显示
- 添加统计面板:用「Stat」或「Gauge」类型的面板,展示各级别日志的总数或实时数量
- 用上面的多级别分组查询,设置面板类型为「Stat」,就能按level展示每个级别的总数
- 可以单独做一个Gauge面板专门展示ERROR日志数,方便快速识别异常
- 调整时间范围:根据你的需求设置仪表盘的默认时间范围(比如最近1小时、最近6小时等),Grafana会自动适配
$__interval变量
三、性能优化小技巧
- 提前提取标签:如果你的日志采集器(比如Promtail)支持在采集阶段就把level字段提取为Loki的标签,那查询会更高效——比如直接用
count_over_time({name="mycoolapp", level="INFO"} [$__interval]),不用在查询时解析JSON - 缩小查询范围:永远先通过服务名、实例名等标签过滤日志,避免全量扫描Loki的所有数据,这对查询速度影响很大
- 合理设置时间间隔:如果是看长期趋势(比如最近7天),可以手动把时间间隔调大(比如1h),减少数据点数量,提升渲染速度
这样一套配置下来,你就能得到和用Prometheus metrics几乎一样的日志统计仪表盘了,完全基于Loki的原始日志数据。
备注:内容来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

