使用Grafana和Loki查询日志时如何对用户条目进行去重
问题解决方法
问题原因
Grafana Logs面板自带的去重功能仅支持合并连续出现的相同日志行,当不同用户的日志交错出现时,相同用户名的行不连续,无法触发去重规则,因此会出现重复结果。
推荐解决方案:Loki查询层直接去重
Loki 2.3及以上版本内置distinct聚合运算符,可以直接返回指定提取字段的全局唯一值,不需要依赖面板端的去重能力,查询语句如下:
{job="my-app"} | json | username != "" | distinct username
该查询会直接返回去重后的用户名列表,不管日志上报顺序是否交错,最终结果中每个用户名仅会出现一次,完全符合需求。
备选方案(Loki版本低于2.3时使用)
如果你的Loki版本不支持distinct运算符,可以配合Grafana的Transform转换功能实现全局去重:
- 保留你原有的查询语句不变
- 打开当前面板的Transform标签页,添加「Group by」转换规则
- 分组字段选择
username,聚合规则可任选(比如选Count统计用户活跃次数) - 配置面板的展示列,仅保留
username字段即可
如果可以更换面板类型,更推荐切换为Table面板,使用如下聚合查询实现:
sum by (username) (count_over_time({job="my-app"} | json | username != "" [$__range]))
该统计结果天然就是去重的用户名列表,还可以同时展示每个用户的活跃次数。
内容的提问来源于stack exchange,提问作者zpr
相关产品推荐
相关产品推荐

