iT邦幫忙

2023 iThome 鐵人賽

DAY 13
1
Cloud Native

時光之鏡:透視過去、現在與未來的 Observability系列 第 13

Logs - 紀錄的一切都將成為呈堂證供

  • 分享至 

  • xImage
  •  

Log 是軟體中最基礎的資訊。你是否還記得在寫第一段程式時,透過印出各種可能出錯的訊息,依靠這些文字內容找到了你的第一個 Bug?隨著撰寫的程式不斷累積,你逐漸不再像初學時那樣印出所有訊息,而是只在可能出錯的地方留下 Log,雖然偶爾還是會踩坑,懊悔沒有在關鍵位置多留下些 Log。從留下所有資訊,到精選需要的資訊,我們不僅學會了如何有效利用 Log,更學會了如何精確地留下有價值的資訊。如果能妥善運用 Log,這位從寫下第一行程式碼起就伴隨我們的夥伴將帶來巨大的價值。

日誌資訊的處理流程

Log 的格式各異,使用方式也不盡相同,但其結構仍可遵循我們前述的四個步驟:生成、收集、儲存與使用。

生成

Log 可以由多種方式生成。最常見的是直接在程式碼中使用如 printconsole.log 的函式,或者是使用專用的 Log Library,例如 Python 的 logging、Java 的 Log4jLogback。按照生成方式,Log 可大致分為以下三類:

  1. Console:通過 STDOUT 或 STDERR 輸出於 Console
  2. File:記錄在檔案中,可能搭配 Rotate 進行檔案管理
  3. Stream:透過網路傳輸,直接將 Log 輸出至 Log Server

根據不同需求,可能會輸出除了 Log 內容外的資訊,常見的包括:

  1. 時間:記錄 Log 的時間
  2. Level:記錄 Log 的等級,如:DEBUG、INFO、WARN、ERROR、FATAL
  3. 補充資訊:記錄其他資訊,如:IP、機器名稱、程式名稱、函式名稱等

按照不同的結構,Log 的格式也有所不同:

  1. Text:純文字格式,一般會搭配 Pattern 指定日期、Level、程式名稱等格式,例如 Pattern 為 %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!
  2. Structured:結構化格式
    • JSON:JSON 格式的結構化 Log,例如:{"time": "2021-09-19 15:00:00", "level": "INFO", "logger": "main", "message": "Hello World!"}
    • logfmt:使用 logfmt 格式的結構化 Log,為 Key-Value 成對的形式,使用 = 配對與空格分隔每對資料,例如: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 兩種模式:

  1. Push:Log 生成後主動推送至 Log Server。通常由 Log Library 負責,並常用於 Stream 形式的 Log。
  2. Pull:由另外執行的 Agent 程式主動從 Console 或 File 中爬取 Log,然後推送至儲存 Log 的服務。

在收集過程中,可能需要添加或遮蔽某些資訊,如 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 進行告警。

常見的使用方式包括:

  1. 文字編輯器:使用 Ctrl(CMD) + F 或正規表達式搜尋
  2. CLI:如使用 grep 指令搜尋
  3. Grafana:查詢 Loki 收集的 Log
  4. Kibana:查詢 Elasticsearch 收集的 Log
  5. SaaS 服務:如 Datadog

Loki Log
Loki Log 查詢畫面

Elasticsearch Log
Elasticsearch Log 查詢畫面,圖片來源:Elasticsearch

DataDog Log
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 需要權衡和仔細評估。當然,考慮到需求會隨時間變化,一開始選擇一個既單純且可擴展性高的解決方案,將更容易應對未來的變化。


上一篇
Zabbix - 指標界的沙場老兵
下一篇
Loki — 解開日誌空間與時間束縛的法杖
系列文
時光之鏡:透視過去、現在與未來的 Observability30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言