ELK Stack:從經典三件套到現代可觀測性平台
在現代分散式架構與雲端環境中,系統每天產生數以億計的日誌。如何將散落各處的事件轉化為可隨時追查的資訊,是維運與後端架構的核心挑戰。ELK Stack 作為集中式日誌分析的代名詞,深刻影響了過去十多年的系統觀測生態。
不過,今天人們口中的「ELK」不一定仍是原封不動的三件套。它可能特指 Elasticsearch、Logstash 與 Kibana,也可能是團隊對 Elastic 日誌平台的習慣性簡稱,即使負責收集日誌的工具已換成 Beats 或 Elastic Agent。
先分清楚「ELK」指的是哪一種用法,才容易理解經典架構與後續產品的關係,也不會誤以為少了 Logstash 就不再算 ELK。
什麼是 ELK Stack?三個核心元件如何分工
ELK Stack 是由 Elasticsearch、Logstash 與 Kibana 三個獨立工具組成的資料處理鏈。它將各主機上的原始事件集中起來,整理成有明確欄位的資料,供工程師查詢與製作圖表。
三個元件的分工如下:
- Logstash(收集與處理):負責從伺服器、容器或訊息佇列接收原始日誌,透過篩選器解析格式、補齊欄位或遮蔽敏感資訊,再送往儲存後端。
- Elasticsearch(儲存與檢索):以分散式架構儲存結構化文件,建立全文索引,支援大量查詢,以及依欄位分組計算筆數、平均值等即時聚合運算。
- Kibana(查詢與呈現):提供直覺的 Web 介面,讓工程師透過 Discover 檢視原始事件、建立 Dashboard 追蹤指標,或設定異常告警。
簡單來說,Logstash 整理資料、Elasticsearch 儲存與搜尋、Kibana 呈現結果。
ELK 都是開源軟體嗎?
三個工具都起源於開源專案,目前則由 Elastic 公司主導開發與發行。因此,「開源專案」不代表背後沒有公司;企業可以雇用核心開發者、決定產品方向,並同時提供免費與付費功能。
三者目前的授權也不完全相同。Logstash 維持 Apache 2.0 授權;Elasticsearch 與 Kibana 的部分原始碼則可選擇 AGPLv3、SSPL 1.0 或 Elastic License 2.0,官方預設發行版採用 Elastic License 2.0。
其中 AGPLv3 是開放原始碼促進會(OSI)認可的開源授權,但 SSPL 與 Elastic License 2.0 並未獲 OSI 認可。這也是為什麼「看得到原始碼」不一定等同於「採用開源授權」。
所以,將 ELK 籠統稱為「三套開源軟體」並不夠精確。更準確的說法是:它們都源自開源生態,也由 Elastic 主導發展,但各元件與官方發行版的授權條件不盡相同。本文稍後的「授權分岔與生態演進」一節,會再說明 2021 年的授權轉折,以及 OpenSearch 為何因此誕生。
經典三件套的資料流:以 Nginx 日誌定位問題為例
為了理解三元件如何協同運作,我們以經典架構下的 Web 服務存取日誌為例。單台主機的文字紀錄容易閱讀,但在數十台伺服器同時運作時,唯有集中與結構化才能支援跨主機分析。
[ 資料來源:Nginx / App / Syslog ]
| 原始事件
v
[ Logstash:輸入 -> 處理 -> 輸出 ]
- Input:file、syslog、beats
- Filter:grok、mutate、date
- Output:elasticsearch
| 結構化文件
v
[ Elasticsearch:叢集與儲存 ]
- 反向索引與列式儲存
- 分散式搜尋與聚合運算
| 查詢結果
v
[ Kibana:視覺化與分析 ]
- Discover / Dashboard / 告警
從告警到定位:具體操作流程
假設線上系統發出 HTTP 500 錯誤率上升的告警。在沒有集中日誌的傳統環境中,值班工程師必須逐台登入主機、執行 tail 或 grep;一旦容器重新啟動,現場紀錄甚至可能直接遺失。
在經典 ELK 流程中,工程師可以透過查詢日誌來定位問題:
- 解析日誌欄位:Logstash 接收日誌文字,透過 Grok 模式將未結構化字串解析為
status、request_path與duration等欄位;host等主機資訊則可能由 Beats 等採集端一併附加。 - 篩選告警時段:工程師在 Kibana Discover 將時間範圍鎖定在告警區間;Elasticsearch 依
@timestamp從已索引的資料中篩出相關事件。 - 依路徑與主機分組統計:先篩選出
status >= 500的事件,再以request_path與host即時分組,迅速發現錯誤全數集中在特定主機的/api/checkout端點。
ELK 的核心價值,是讓工程師能在同一個介面查詢分散在各主機、格式不同的日誌,並交叉比對來找出問題。
Grok 如何把一行日誌拆成欄位?
Grok 是 Logstash 用來從文字中擷取欄位的篩選器。可以把它想成一組「有名稱的正規表示式積木」:IP、NUMBER、HTTPDATE 等內建模式各自負責辨識一種常見格式,工程師再將它們組合起來,不必從頭撰寫一大串難以閱讀的正規表示式。
Grok 不會自行猜測每段文字的意思。工程師仍要依照日誌格式指定哪一段是 IP、時間、請求路徑或狀態碼,並替擷取結果命名。假設 Nginx 產生以下存取日誌,其中最後一個數字代表以秒計算的請求處理時間:
203.0.113.7 [22/Sep/2026:14:32:10 +0800] "POST /api/checkout HTTP/1.1" 500 842 0.731
對應的 Grok 模式可以寫成:
%{IP:client_ip} \[%{HTTPDATE:timestamp}\] "%{WORD:http_method} %{URIPATHPARAM:request_path} HTTP/%{NUMBER:http_version}" %{NUMBER:status:int} %{NUMBER:bytes:int} %{NUMBER:duration:float}
%{IP:client_ip} 表示以內建的 IP 模式比對文字,並將結果存入 client_ip;%{NUMBER:status:int} 則辨識數字、命名為 status,再轉為整數。Logstash 依此產生結構化事件:
{
"client_ip": "203.0.113.7",
"http_method": "POST",
"request_path": "/api/checkout",
"status": 500,
"bytes": 842,
"duration": 0.731
}
接著,date filter 可以把原始時間轉成標準的 @timestamp。若某行日誌不符合 Grok 模式,預設會被標記為 _grokparsefailure,工程師便能另外檢查格式例外。
這個過程並非讓 Logstash 理解日誌的意思,而是依照已知格式,把每段文字擷取並命名。原本只能閱讀的字串因此成為可以篩選、分組與聚合的欄位。
演進歷程:從獨立專案到 Elastic 平台
ELK 並非由單一團隊預先規劃的套裝軟體,而是三個解決不同痛點的開源專案在發展過程中逐步靠攏的成果。
2010 前後
[Elasticsearch] -+
[Logstash ] -+--> [ELK Stack] (2013, 同一家公司)
[Kibana ] -+ |
v
[Elastic Stack] (2016, 5.0 / Beats)
|
v
[授權變更] (2021, OpenSearch 分岔)
|
v
[增設 AGPLv3] (2024)
三個獨立專案的整合
2010 年前後,三個元件各自以獨立開源專案誕生。Elasticsearch 是以 Apache Lucene 為核心的分散式搜尋引擎,將 Lucene 的搜尋能力封裝成可透過 RESTful API 與 JSON 操作的服務。Logstash 確立了「Input ➔ Filter ➔ Output」管線模型。Kibana 則專為 Elasticsearch 提供視覺化查詢介面。
2013 年,三項專案的主要維護者都加入了同一家公司,「ELK Stack」架構自此確立,迅速成為集中式日誌分析的產業標準。
從 Beats、Elastic Stack 到 Elastic Agent
早期常見的做法,是在每台伺服器上啟動 Logstash,持續讀取本機日誌檔新增的內容,解析後再傳送至 Elasticsearch。問題在於每台主機都要常駐一個功能完整的 Logstash JVM 行程;即使只用來搬運日誌,也會占用記憶體與 CPU。
官方隨後推出各自負責特定資料類型的輕量採集工具 Beats(如 Filebeat、Metricbeat)。2016 年,官方將各元件版本統一為 5.0,正式定名為 Elastic Stack。
主機數量增加後,逐一管理 Beats 設定檔也變得費力。近年官方推出 Elastic Agent,以單一 Agent 整合多種採集能力,搭配 Kibana 中的 Fleet 集中派送設定與管理升級;Logstash 則移到後端,專責整併不同來源的資料,以及複雜的資料擷取、轉換與載入(ETL)。
平台涵蓋的資料也逐步超出日誌。Elastic Agent 可以收集日誌(logs)、指標(metrics)與追蹤資料(traces),Kibana 則從早期的視覺化介面,擴張為探索資料、設定告警及管理可觀測性與安全功能的共同入口。
換句話說,Elastic Stack 並不是在 ELK 後面不斷加上新工具而已,而是從固定的三段式日誌管線,轉變成一組可以依資料來源與處理需求搭配使用的工具。
授權分岔與生態演進
2021 年,Elastic 將授權從 Apache 2.0 改為 SSPL 與 Elastic License 雙授權,AWS 隨即主導從既有程式碼分岔出 OpenSearch。2024 年,Elastic 宣布為原始程式碼增設 AGPLv3 開源選項。
NOTE
優勢與代價:採用前要考量什麼?
ELK 提供靈活的搜尋與分析方式,但也需要相應的硬體資源與維運投入。
不只集中日誌:同一套資料鏈能做什麼?
集中式日誌仍是 ELK 最直觀的用途:Web Server、應用程式、作業系統與網路設備的事件被整理成共同欄位後,工程團隊便能在同一條時間軸上搜尋、比對部署前後差異,並建立容量趨勢與稽核查詢。
安全團隊也能以相同方式處理登入失敗、權限變更、防火牆與端點事件;產品點擊流、交易事件等時間序列資料,同樣可以送入這條資料鏈分析。
現代 Elastic 平台也將指標與追蹤資料整合到同一個查詢介面。工程師收到延遲告警後,可以查看相關請求經過哪些服務、各花了多少時間,再用 request ID 回查應用程式日誌。
這不代表所有資料都要經過 Logstash 或套用完全相同的索引策略,而是讓日誌、指標與追蹤資料能透過共同欄位與時間範圍相互對照。從「集中看 Log」走到「跨訊號追查問題」,正是 ELK 演變為可觀測性平台的關鍵一步。
核心優勢
- 強大的全文檢索與多維聚合:能在巨量日誌中搜尋文字,並同時計算分組統計與百分位數,例如用 P95 延遲表示 95% 請求的耗時不超過這個值。
- 高度模組化與擴充性:Logstash 擁有豐富外掛生態,Elasticsearch 具備成熟的分片(Sharding)機制,能將資料分散儲存,並透過增加節點擴充叢集。
- 成熟的生態與社群支援:Elastic 生態針對許多常見資料來源提供現成的資料匯入設定與 Kibana 儀表板範本。
必須面對的維運代價
- 儲存與記憶體開銷龐大:Elasticsearch 為支援快速檢索與聚合,需同時建立反向索引(Inverted Index)與磁碟列式結構(Doc Values),磁碟與記憶體消耗遠大於純文字壓縮儲存。
- 欄位格式不易統一:若未統一欄位命名規範(如 Elastic Common Schema),不同微服務產生的型別衝突(Mapping Conflict)會導致寫入失敗或無法統一統計。
- 叢集與 JVM 需要維運經驗:分片數量規劃不當會引發效能驟降;底層 JVM 的記憶體配置與垃圾回收(GC)調校,都需要專門的維運經驗。
成本也不只發生在叢集啟動當下。團隊還要決定哪些欄位需要索引、資料要保留多久、何時轉入較低成本的儲存層,以及如何處理備份、升級、權限與故障復原。採用託管服務可以轉移部分主機與升級工作,卻不會消除資料量、索引策略與保留政策帶來的成本。
為了降低這些儲存與維運成本,後來出現了更多適合雲原生環境的輕量日誌方案。
ELK 過時了嗎?從現代架構看它的角色
評估 ELK 是否仍適用,要分開看兩件事:過去的部署方式是否合適,以及它解決的問題是否仍然存在。
過去「每台主機必跑 Logstash、所有日誌全文索引」的重型做法,已不再是多數團隊的預設選擇;但「收集、正規化、保存、檢索與視覺化」的核心需求從未改變。在今日的觀測體系中,資料流向有了更多現代化的路徑選擇。
現代資料流不一定經過 Logstash
經典 ELK 把 Logstash 放在唯一入口,但現代架構會依處理複雜度選擇不同路徑。格式穩定、只需基本欄位轉換的資料,可以由 Elastic Agent、Beats 或應用程式直接送進 Elasticsearch,再由 Elasticsearch 內建的 ingest pipeline,在寫入前解析或轉換欄位。
需要跨來源整併、複雜條件轉換或同時輸出至多個目的地時,才讓 Logstash 承擔中央處理角色。
OpenTelemetry Collector 又提供另一種入口:應用程式可以先以通用標準產生與收集 logs、metrics、traces,再把資料送往 Elastic 或其他後端。
OpenTelemetry 解決的是遙測資料如何產生、收集與匯出,Elasticsearch、OpenSearch 或 Loki 解決的則是如何保存與查詢;兩者位於不同層級,不是只能擇一的競爭產品。
[ 資料來源 ]
|
v
[ 採集層:Elastic Agent / Beats / OTel Collector ]
|
v
[ 處理層(依需求):Logstash / ingest pipeline ]
|
v
[ 儲存與查詢後端:Elasticsearch / OpenSearch / Loki ]
|
v
[ 探索與視覺化:Kibana / OpenSearch Dashboards / Grafana ]
實際架構不必包含每一層,也不是所有工具都能任意互接;團隊會依採集方式、轉換需求與後端支援選擇路徑。
現代觀測生態中的定位對照
| 方案 | 核心機制與定位 | 適用情境與取捨 |
|---|---|---|
| Elasticsearch / Elastic Stack | 反向索引 + 供聚合使用的磁碟列式結構,涵蓋日誌、指標與追蹤的全功能觀測平台 | 支援任意全文檢索與多維即時聚合;儲存與 Java 叢集維運成本較高 |
| OpenSearch | 從 Elasticsearch 7.10.2 分岔出的開源分支,維持同源分散式架構 | 適合需維持 Apache 2.0 授權相容性或深度整合 AWS 託管服務的團隊 |
| Grafana Loki | 僅對標籤(Labels)建索引,日誌本體壓縮存放於物件儲存(如 S3) | 適合以較低成本長期保存雲原生容器日誌;查詢時先以標籤縮小範圍,再逐行掃描日誌內容,不適合複雜全文探查 |
| OpenTelemetry(OTel) | 業界通用的遙測標準與工具,專注於資料的產生、收集與匯出 | 統一採集層,可串接 Elastic、Loki 等各類後端,降低供應商鎖定 |
先看查詢方式,再選擇後端
ELK 的優勢在於,工程師即使事前不知道問題出在哪裡,也能從錯誤訊息開始全文搜尋,再依服務、版本、主機與狀態碼逐步縮小範圍。若事故調查經常需要這種探索式查詢,資料又來自格式各異的系統,Elasticsearch 的全文索引與多維聚合就有明確價值。
反過來說,若資料格式一致、查詢大多圍繞少數已知標籤,而且主要目標是用較低成本長期保存大量 Kubernetes 日誌,完整索引所有內容可能並不划算。這時 Loki 之類以標籤索引搭配物件儲存的設計,往往更貼近實際需求。
因此,選型前應先回答幾個問題:各來源的資料格式差異多大?是否需要任意全文搜尋?常用查詢能否先用標籤縮小範圍?資料要保存多久?團隊是否有能力統一欄位格式,並管理索引從建立到分層儲存、刪除的生命週期,以及備份與升級?這些答案比「哪一套工具比較新」更能決定合適的架構。
結論:依查詢需求與維運能力選擇
今天談論「ELK」,可能指 2013 年成形的經典三件套,也可能指現代 Elastic 平台。它所建立的收集、儲存與查詢分工,仍是理解集中式日誌分析的基礎。
在做現代技術架構選型時,建議依據以下原則決策:
- 選擇 Elasticsearch / OpenSearch:當日誌來源多、格式差異大、需要任意全文搜尋、依賴多維度即時聚合,且具備充足硬體預算與維運資源時。
- 選擇 Loki 等輕量化方案:當日誌主要來自 Kubernetes 等容器環境、查詢多依賴已知的標籤(如 Service、Namespace),且首要目標是大幅壓低長期日誌儲存成本時。
理解經典 ELK 從收集、處理到查詢的分工,再對照今天各元件能做什麼,就能依團隊需求組合出合適的觀測架構。