Log 是軟體中最基礎的資訊。你是否還記得在寫第一段程式時,透過印出各種可能出錯的訊息,依靠這些文字內容找到了你的第一個 Bug?隨著撰寫的程式不斷累積,你逐漸不再像初學時那樣印出所有訊息,而是只在可能出錯的地方留下 Log,雖然偶爾還是會踩坑,懊悔沒有在關鍵位置多留下些 Log。從留下所有資訊,到精選需要的資訊,我們不僅學會了如何有效利用 Log,更學會了如何精確地留下有價值的資訊。如果能妥善運用 Log,這位從寫下第一行程式碼起就伴隨我們的夥伴將帶來巨大的價值。
Log 的格式各異,使用方式也不盡相同,但其結構仍可遵循我們前述的四個步驟:生成、收集、儲存與使用。
Log 可以由多種方式生成。最常見的是直接在程式碼中使用如 print
或 console.log
的函式,或者是使用專用的 Log Library,例如 Python 的 logging、Java 的 Log4j 或 Logback。按照生成方式,Log 可大致分為以下三類:
根據不同需求,可能會輸出除了 Log 內容外的資訊,常見的包括:
按照不同的結構,Log 的格式也有所不同:
%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%c] [%t] %m%n
的 Log 輸出後會變成 2021-09-19 15:00:00 [INFO] [main] [com.example.Main] Hello World!
{"time": "2021-09-19 15:00:00", "level": "INFO", "logger": "main", "message": "Hello World!"}
=
配對與空格分隔每對資料,例如:time="2021-09-19 15:00:00" level="INFO" logger="main" message="Hello World!"
結構化 Log 的優點是可以更容易有結構地增加補充資訊。而 Pattern Log 雖可通過自訂格式達到相同效果,但需要進行額外處理。此外,許多 Log 工具也支援解析結構化 Log,解析後就可以直接對 Key 進行查詢或統計,例如:level=INFO
便可找出所有 INFO 等級的 Log。
收集分為 Push 和 Pull 兩種模式:
在收集過程中,可能需要添加或遮蔽某些資訊,如 IP、機器名稱或使用者密碼。這些處理方式會因收集模式的不同而有所不同。例如,在 Push 模式下,可在 Log Library 中處理;在 Pull 模式下,一般會在 Agent 設定由 Agent 負責處理。
Log 的儲存方式會受其預定使用方式的影響。舉例來說,如果主要目標是對 Log 進行詳細搜尋,可以使用專門的搜尋引擎,如 Elasticsearch,它能快速索引和查詢大量文字數據。而如果是要進行數據分析和挖掘,可能會需要更高級的分析工具,如 Apache Spark,它能夠處理和分析龐大的數據集。為了讓 Log 能夠被這些工具使用,都需要額外處理將 Log 轉換為工具能夠理解的格式。
在儲存 Log 時,成本控制是一個重要的考量因素。鑑於 Log 文件的龐大量,為了有效管理磁碟空間和成本,除了在生成或收集時就進行過濾外,定期刪除過時的或不再需要的 Log 資料,或者使用資料壓縮技術,都是降低儲存成本的有效方法。另外,某些儲存工具或解決方案會因應資料索引、查詢效能優化等需求,而需要額外的儲存空間來建立索引或保存 Metadata,這會進一步使用更多額外的磁碟空間。
Log 可以通過多種方式使用,包括文字編輯器、CLI、Web UI、API 等進行查詢,一些進階的工具還能將 Log 使用 Dashboard 進行視覺化,或設定 Alert 進行告警。
常見的使用方式包括:
Loki Log 查詢畫面
Elasticsearch Log 查詢畫面,圖片來源:Elasticsearch
DataDog Log 查詢畫面,圖片來源:DataDog
Log,這門古老的技術,經年累月的發展,已孕育出多種工具與解決方案,例如 ELK(Elasticsearch + Logstash + Kibana)、EFK(Elasticsearch + Fluentd + Kibana)、PLG(Promtail + Loki + Grafana),還有像 Datadog 這類的 SaaS 解決方案。選擇何種工具,完全取決於使用需求。有時,使用者僅需要簡單的搜尋工具如 Ctrl(CMD)+ F 或 grep,而過於繁瑣的功能反而只會增加使用者的學習成本。同時也需留意,過多的 Log 除了可能拖慢系統性能,還可能用盡磁碟空間,使服務無法運作。然而,過少的 Log 又會讓我們無法追溯到問題的源頭。因此,使用 Log 需要權衡和仔細評估。當然,考慮到需求會隨時間變化,一開始選擇一個既單純且可擴展性高的解決方案,將更容易應對未來的變化。