服务一多(多台机器、多个实例),日志就分散在各台服务器上——查一个问题要 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 查全链路
想了解拿到日志后怎么定位线上问题,看「线上调试」(文章整理中)。
