首页/云/可观测性速查/Loki 标签设计原则
日志平台52 条

Loki 标签设计原则

标签决定数据分片与索引体积:用低基数、稳定的维度(集群/环境/服务/级别),高基数内容放日志正文;标签爆炸是 Loki 故障的常见源头。

可观测性速查云更新于 2026-10-13

Loki 标签设计是什么

Loki 用标签集合定义「流」,标签决定数据分片方式与索引体积,是它区别于全文索引的核心设计。原则是用低基数、长期稳定的维度(cluster、env、app、level),把高基数的内容(请求 ID、用户 ID、路径)留在日志正文里。标签一旦膨胀,写入与查询都会明显变慢。

基本信息

标签作用定义流,决定分片与索引
推荐维度cluster / env / app / namespace / level
避免维度request_id、user_id、完整路径
流数量限制max_streams 等限额约束
查询顺序先用标签缩小流,再行过滤
变更代价改标签等于换流身份,历史不重归属

典型使用场景

  • 设计接入方案时先确定哪几个字段做流标签,避免上线后重构
  • 排查日志查询变慢时检查是否出现高基数标签
  • 多集群统一接入时用 cluster 标签区分来源
  • 按 env 把测试与生产日志分开,避免互相干扰
  • 把业务维度做成日志正文里的字段,用解析后过滤而非标签
  • 评估标签变更影响时,先确认历史数据的归属与看板依赖

设计对照

设计对照
# 推荐(低基数、稳定)
{cluster="dc1", env="prod", app="api", level="error"}

# 避免(高基数 / 易变)
# {request_id="a1b2...", user_id="9527", path="/order/12345"}
# 这些字段应作为日志正文或解析后字段使用,而不是流标签

# 高基数内容靠解析后过滤:
{app="api"} | json | request_id="a1b2c3"

维度取舍

维度是否做标签原因
cluster / env是基数极小且稳定
app / service是数量可控,查询主力维度
level是(视情况)取值固定,便于筛错误
request_id否基数爆炸,查询可替代
path / user_id否取值多且易变,放正文
标签集合决定流的数量:流过多会命中 max_streams 限额,写入与查询都会变慢,这是 Loki 最常见的故障成因。
高基数字段不是不能查,而是要用「先标签后解析过滤」的方式查:{app="api"} | json | request_id="..."。
标签值不要拼接时间或版本号,否则每天产生一批新流,索引与分片都会被拖垮。
新增标签前先估算基数:基数 = 各标签取值数的乘积,任何一项取值多都会让流数量成倍增长。

易错点

  • 把动态值拼进标签(如路径 ID)会让流数量指数级膨胀
  • 修改标签方案等于改变流身份,历史数据不会自动重新归属
  • 标签值里带时间或版本号会持续产生新流,长期拖慢写入与查询
  • 把 level 做成标签虽常见,但若业务日志级别取值过多也会推高流数量,需评估
  • 忽略流数量限额,写入被拒时日志会丢失,且现象是部分日志缺失而非直接报错

数据来源与参考

  • Grafana 官方文档 · Labels best practices
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌