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="..."。
标签值不要拼接时间或版本号,否则每天产生一批新流,索引与分片都会被拖垮。
新增标签前先估算基数:基数 = 各标签取值数的乘积,任何一项取值多都会让流数量成倍增长。