如何在Loki中按template_hash获取Top-K日志并展示日志样本?
在Loki中按template_hash获取Top-K日志并展示样本
问题背景
你的日志格式示例如下:
[2025-10-02 21:46:34] [DEBUG] [template_hash:aaaaaaaa] Hello Alice [2025-10-02 21:46:34] [DEBUG] [template_hash:aaaaaaaa] Hello Bob [2025-10-02 21:46:34] [DEBUG] [template_hash:aaaaaaaa] Hello Charlie [2025-10-02 21:46:34] [DEBUG] [template_hash:bbbbbbbb] Hey Alice [2025-10-02 21:46:34] [DEBUG] [template_hash:bbbbbbbb] Hey Bob [2025-10-02 21:46:34] [DEBUG] [template_hash:cccccccc] Howdy Alice
你已能通过以下查询获取Top-K的template_hash及其计数:
sum by(template_hash) (topk(4, count_over_time({app="$deployment"} | logfmt template_hash [$__auto])))
现在需要实现:按日志模板的出现频率从高到低,展示每个高频模板对应的近期日志样本。
解决方案
方式一:子查询过滤+日志展示
通过子查询先筛选出Top-K的template_hash,再匹配对应的日志内容,适合快速查看所有高频模板的日志:
{app="$deployment"} | logfmt template_hash | where template_hash in ( topk(4, sum by(template_hash) (count_over_time({app="$deployment"} | logfmt template_hash [$__auto]))) ) | sort by template_hash # 可替换为按时间排序:| sort by timestamp desc
- 第一行:过滤目标应用的日志并解析出
template_hash字段 - 第二至第四行:只保留出现频率Top4的哈希值对应的日志
- 最后一行:按哈希分组排序(或按时间倒序查看最新日志)
方式二:关联计数与日志样本(需Loki ≥2.4.0)
使用join操作同时展示每个Top哈希的计数和对应的日志样本,更直观地看到频率与内容的对应关系:
topk(4, sum by(template_hash) (count_over_time({app="$deployment"} | logfmt template_hash [$__auto]))) | join on(template_hash) ( {app="$deployment"} | logfmt template_hash | latest_over_time(1m) )
- 第一部分:获取Top4的
template_hash及其出现次数 - 第二部分:关联每个哈希的最近1分钟内的最新日志样本
如果需要查看每个模板的多条样本,可将latest_over_time(1m)替换为范围查询并限制条数:
topk(4, sum by(template_hash) (count_over_time({app="$deployment"} | logfmt template_hash [$__auto]))) | join on(template_hash) ( {app="$deployment"} | logfmt template_hash | range [$__auto] | limit 3 )
这样每个高频模板会展示最多3条近期日志。
备选方案(无join支持时)
如果你的Loki版本不支持join,可以先运行原查询得到Top-K的哈希值,再分别查询每个哈希对应的日志:
# 查看aaaaaaaa模板的日志 {app="$deployment"} | logfmt template_hash | template_hash="aaaaaaaa"
重复此操作查询其他高频哈希即可。
内容的提问来源于stack exchange,提问作者Jon Bates
相关产品推荐
相关产品推荐

