Skip to content

服务一多(多台机器、多个实例),日志就分散在各台服务器上——查一个问题要 SSH 到每台机器 tail,效率极低。日志收集把所有机器的日志集中到一个地方,统一检索。这篇快速入门:ELK 架构、怎么用。

一、解决什么问题:日志别再"翻服务器"

没有日志收集:查线上问题 → SSH 到服务器 → grep 日志 → 换台服务器再查……又慢又容易漏。

有日志收集:所有服务的日志进一个检索系统,关键字一搜,全链路日志都出来。

二、ELK 架构

应用日志 ──> Filebeat(采集) ──> Logstash(处理) ──> Elasticsearch(存储+索引)

                                                     Kibana(检索+看板)
组件干什么
Filebeat轻量采集器:每台服务器上装一个,把日志文件读出来发走
Logstash处理管道:解析格式、过滤、清洗(也可省略,Filebeat 直连 ES)
Elasticsearch存储 + 全文检索(核心)
Kibana可视化检索界面

轻量替代:日志量不大、不想上 ELK,可以用 Loki(Grafana 家)+ Promtail,和 Grafana 一套,更轻。

三、应用侧:日志要"结构化"

收集上来要能搜,日志得结构化(JSON)而不是纯文本:

java
// ❌ 难搜:自由文本
log.info("用户 " + userId + " 下单 " + orderId + " 金额 " + amount);

// ✅ 好搜:JSON 结构化,能按字段过滤
log.info("下单成功 {}", json("userId", userId, "orderId", orderId, "amount", amount));

结构化后 Kibana 里能直接按 userId 过滤,查"某个用户的所有操作"一条命令搞定。

四、Kibana 检索

text
# 基本查询
message: "下单成功"                # 全文搜

# 按字段过滤
userId: "1001" AND level: ERROR    # 某用户的报错

关键用法:出问题先按 traceId(链路 ID)搜——一个请求的所有日志(网关→服务A→服务B)共用同一个 traceId,一条命令拉出全链路。

小结

  • 日志收集 = 所有机器日志集中到一处,统一检索
  • ELK 全家桶:Filebeat 采集 → ES 存储检索 → Kibana 界面
  • 轻量替代:Loki + Promtail
  • 日志要结构化(JSON),按 traceId 查全链路

想了解拿到日志后怎么定位线上问题,看「线上调试」(文章整理中)。