ArcLibrary

日志聚合体系

从「上服务器 grep」到「集群级搜索 + 关联追踪」 —— 日志架构演进。

日志ELKLoki
核心 · Key Idea

一句话:服务到一定规模后,日志必须中心化 —— 收集 → 解析 → 索引 → 查询 → 告警。主流两条路:ELK / OpenSearch(全文索引,强但贵)和 Loki(标签索引,省钱够用)。

是什么#

[应用 stdout]  ──┐
[journal]    ──┼──> [采集 agent]──> [中心存储] ──> [查询 UI]
[文件日志]    ──┘    Promtail/Vector/  Loki/ES        Grafana/Kibana
                     Fluent Bit

应用写到 stdout 是云原生默认;agent 跑在每个节点把日志推到中心。

打个比方#

打个比方 · Analogy

单机日志 = 每家自己写日记:找事得挨家敲门翻
日志聚合 = 村办图书馆:每家把日记自动送来归档,全村查找一处搞定。

关键概念#

结构化日志Structured
JSON 行而非纯文本:`{level, ts, trace_id, msg, ...}`。否则解析全靠 regex。
Trace ID追踪 ID
贯穿一次请求的唯一 ID。日志和 Trace 关联的关键。
采集 agentCollector
Promtail / Vector / Fluent Bit / OpenTelemetry Collector。
倒排索引Inverted Index
ES 给每个 token 建索引,**全文随便搜**,但磁盘 / 内存代价高。
标签索引 (Loki)Label Index
只索引 label(service / pod / level),日志体不索引;查询便宜,全文需扫。
保留期Retention
热数据 7–30 天 + 冷归档 S3 / OSS 数月。

怎么工作#

K8s 环境的事实组合:Promtail/Fluent Bit + Loki + Grafana。

实操要点#

  • 应用统一 JSON 日志{"ts":"...","level":"info","trace_id":"abc","msg":"...","fields":{...}}
  • 关键字段做 label,正文放 message:service、pod、level、env 适合做 label;user_id、order_id 放 message 里供搜。
  • 不要把全部 K8s annotations 当 label:会让 Loki / ES 索引爆炸。
  • 采样高频日志:debug 级别要么不出生产,要么按比例采样(1/100)。
  • PII 脱敏:手机号 / 身份证 / token 在 agent 层正则替换 ***
  • Trace + Log 互跳:日志带 trace_id,Grafana 中点 trace_id 跳到 Tempo 看 trace;反向亦可。
  • 磁盘保护:limit log retention + log rotation,避免节点把磁盘写爆。

选型#

ELK / OpenSearch
强大全文搜索 / 复杂查询。重,贵,运维高。
Loki + Grafana
标签索引省钱,K8s 体验丝滑。全文检索弱。
ClickHouse / Doris
海量结构化日志 + SQL 分析。需要建表。
Datadog / 新增云厂商 SaaS
省心,按 GB 计费,规模上来很贵。

易混点#

日志
事件 / 文本,**详细但量大**。
适合「发生了什么」。
指标
数值 / 时间序列,**汇总后小**。
适合「现在是什么状态」。

延伸阅读#