核心 · Key Idea
一句话:Loki 把标签做索引、日志正文不索引,存对象存储 → 比 ES 便宜十倍。配 Promtail / Vector / Alloy 采集,配 Grafana 用 LogQL 查,和 Prometheus 完美呼应。
是什么#
helm install loki grafana/loki-stack \
-n monitoring --set grafana.enabled=false \
--set promtail.enabled=trueLogQL 长得像 PromQL:
{namespace="prod", app="web"} |= "error"
{app="web"} | json | status >= 500
sum(rate({app="web"} |~ "panic" [5m])) by (pod)打个比方#
打个比方 · Analogy
ES = 图书馆给每本书每个词都建卡片 —— 强大、贵;
Loki = 只贴书脊标签(架号 / 作者),找书先按标签锁货架,再翻一两本 —— 省 80% 钱,够 90% 场景。
关键概念#
Stream日志流
由一组 label 唯一标识的一条日志流(namespace+app+pod+...)。
Label vs Filter索引 vs 过滤
Label 进索引(控制流数量);正文用 |= / |~ / json 过滤(不进索引)。
Chunks存储块
Loki 把日志切块压缩存到对象存储(S3 / GCS / R2 / MinIO)。
BoltDB-shipper / TSDB索引方式
Loki 自己维护轻量索引上传到对象存储。
Promtail / Alloy / Vector采集 agent
在每节点跑,发送日志到 Loki。Alloy 是新一代统一 agent。
Multi-tenant多租户
X-Scope-OrgID 头隔离不同租户的数据。
怎么工作#
读路径走 querier 拉块解压扫;短查询快、长跨度查询慢但便宜。
实操要点#
- 不要乱加 label:每多一个值组合就多一条 stream。pod_id / request_id 这种高基数禁止做 label,放正文用
| json解析后过滤。 - JSON 日志事半功倍:
{app="web"} | json | duration_ms > 500,零正则。 - 保留期分层:7-14 天热(block storage 也行),90 天冷(仅对象存储)。
- 告警:LogQL 也能写规则(ruler),错误日志数突增 → Alertmanager 通知。
- 替代 / 补充 ELK:很多团队 ES 留给业务搜索,运维日志全转 Loki 省成本。
- 多集群:每集群 Promtail → 中心 Loki / Mimir 风格分布式 Loki。
- 大体量 用 bloom-shipper 加速正文检索。
易混点#
Loki
标签索引 + 对象存储。
便宜、和 Prometheus 同心智模型。
便宜、和 Prometheus 同心智模型。
Elasticsearch / OpenSearch
全文倒排索引。
强搜索 / 复杂聚合,**贵**。
强搜索 / 复杂聚合,**贵**。