Skip to main content

Command Palette

Search for a command to run...

來自 Grafana 與 OpenTelemetry 的 Logging 最佳實踐

Updated
3 min read
來自 Grafana 與 OpenTelemetry 的 Logging 最佳實踐

現代可觀測性中的 Log 思維革命:來自 Grafana 與 OpenTelemetry 的最佳實踐

以下是影片內容的完整解釋與重點摘要:

1. 2025 年 Log 的角色與重要性

2. OpenTelemetry 為何需要 Logng API? [17:23]

  • 儘管已有很多成熟的 Log [框架(如 Log4j,Python logging),OpenTelemetry 仍推出了自己的 Logging API。

  • 互操作性(Interoperability):最初目的是為了橋接現有的 Log 系統(Log Bridge API)。

  • 統一性:讓使用者能用同一套 API 處理 Metrics、Traces 和 Logs。

  • 強型別與結構化:OpenTelemetry 希望推動 Log 往「結構化(Structured)」方向發展,包含明確的事件名稱(Event Name)與屬性(Attributes),而非僅是純文字字串。

3. 結構化 Log vs. 人類可讀性

  • 兩難:純文字 Log 對人類閱讀除錯很友善,但對機器分析不便;結構化 Log(如 JSON)對機器友善,但人類難以直接閱讀。

  • 建議:Log 應該是結構化的,但保留一個人類可讀的訊息欄位(或將其轉化為 Event Name)。[34:51]

[4. Log 的最佳實踐建議

來賓們分享了具體的實戰建議:

  • 撰寫有意義的錯誤訊息[36:52]

    • Ed強調:當你寫 error log 時,請告訴讀者(通常是未來的你)該怎麼做。不要只寫「資料庫連線失敗」,要寫「資料庫連線失敗,正在重試」或「請檢查某設定」。
  • 直接傳送 vs檔案抓取**[42:50]

    • Jack 建議應用程式應直接透過網路(OTLP協定)發送Log後端,而不是寫入檔案再由 Agent 去抓取(Tail)。這樣能更無縫地保留 Context(如 Trace ID)。

    • Ed 補充建議:在應用程式與後端之間最好有一個本地的Collector**。這樣當需要過濾大量垃圾 Log 時,可以在 Coller 端調整設定,而無需重新部署應用程式。

  • 不要濫用 Log

    • Metrics vs. Logs[47:28]:不要用 Lo 來做高基數(High Cardinality)的計數統計,那應該用 Metrics。

    • Traces vs. Logs [48:29]:如果你想知道「請求花費了多少時間」或「請求的路徑」,請使用 Traces,不要用 Log 印出「開始]請求」、「結束請求」。

  • [Log 等級(Severity[01:03:36]:絕對不要記錄沒有等級的 Log。至少要區分 INFO、ERROR、DEBUG,這對過濾和警報至關重要。

  • 安全性 [01:01:53]:小心不要在 Log 中記錄 PII(個人識別資訊)或 Secrets,也不要記錄完整的 HTTP Headers。

5. 快速問答環節(Good or Bad?)

影片末尾[[57:12]] 進行了一個快問快答遊戲:

  • 格式化 Log 字串?** 不建議(應使用參數化/結構化)。

  • 將所有 Excetion 都記為 Error? 同意。

  • 記錄 Request/Response Body? 通常不建議(成本太高且易洩漏個資,除非有極強烈的除錯需求。

  • 記錄所有細節? 不建議,每一個 bytes都要錢,請有意識地選擇要記錄的內容(Be intention)。


在 Cloud Native 與微服務架構盛行的 2025 年,Log(日誌)這個最古老的除錯工具,是否已經過時?或者它只是需要一點「現代化」的改造?

最近觀看了 Grafana Labs 與 OpenTelemetry (OTel) 技術委員會成員的一場深度對談(Community Call),主題聚焦於 Logging Best Practices。這場討論並非單純的操作教學,而是對於 Log 在現代可觀測性(Observability)中角色的重新定義。

以下整理了影片中的核心觀點,希望能幫助開發者與維運人員打破舊有的 Log 思維,建立更具「意圖性」的可觀測性策略。

1. 觀念翻轉:Log 的定位與「反模式」

在 Tracing(追蹤)技術日益普及的今天,很多人會問:「我還需要 Log 嗎?」答案是肯定的,而且 Log 是不可取代的「唯一真實訊號」。

然而,為了追求新技術,社群中出現了一種名為 Zero Duration Spans(零持續時間 Span) 的怪現象。

什麼是 Zero Duration Span?

開發者為了利用 Tracing 工具的視覺化,將原本該是 Log 的單點事件,包裝成「開始時間等於結束時間」的 Span。

OpenTelemetry 技術委員會成員 Jack Berg 對此提出了精闢的見解:

"If it walks like a log, talks like a log, it's a log." (如果它走起來像 Log,叫起來像 Log,那它就是 Log,別裝了。)

判斷標準

  • Span (Traces):具有層級結構(Hierarchy)與持續時間(Duration)。用來回答「這個請求花了多久?路徑為何?」。

  • Log:發生在特定時間點的事件。用來回答「當下發生了什麼事?」。

最佳實踐:誠實面對資料的本質,不要硬套用 Span 的概念。Log 依然是一等公民。

2. 結構化革命:從「給人看」到「機器優先」

傳統的 Log 是一行行給人類閱讀的字串(Text-based),但在微服務與海量資料的場景下,這種模式已經行不通。OpenTelemetry 正推動 Log 往 結構化(Structured)強型別(Strongly typed) 發展。

為什麼需要結構化?

  • 查詢效率:試想在幾億行 Log 中 grep 字串,與在資料庫中查詢 attributes.http_status_code == 500 的區別。

  • 關聯性:OTel 的目標是讓 Logs、Traces、Metrics 使用統一的語意規範(Semantic Conventions)。

兩難與解法

結構化 Log(如 JSON)對機器友善,但對人類閱讀不便。

  • 建議做法:保留 Log 的結構化欄位(Attributes)供機器分析,但同時保留一個 message 欄位或是將其轉化為易讀的 Event Name 供人類快速瀏覽。

3. 架構演進:File Tail vs. OTLP Direct

你的 Log 是怎麼送到後端的?這涉及到架構的解耦。

傳統模式:File Scraping

應用程式將 Log 寫入磁碟檔案 -> Agent (如 Promtail) 去抓取 (Tail) -> 傳送後端。

  • 缺點:容易丟失 Context(如 Trace ID),且依賴硬碟 I/O。

現代模式:OTLP Direct

應用程式透過網路協定(OTLP)直接將 Log 發送出去。

  • 優點:原生支援結構化,保留完整 Context,無需檔案權限。

🔥 進階技巧:Local Collector Pattern

Grafana Loki 的維護者 Ed 提出了一個極佳的架構建議:在應用程式旁跑一個 Local Collector(作為 Sidecar 或 DaemonSet)。

好處:當你需要將 Log Level 從 INFO 改為 DEBUG 時,你只需要調整 Collector 的過濾規則,完全不需要重新部署應用程式。這實現了極致的維運解耦。

4. 實戰指南:如何寫出「有靈魂」的 Log?

當開發者敲下 logger.error(...) 時,請記住以下原則:

✅ 1. 寫給未來的自己 (Actionable Errors)

不要只寫「連線失敗」。錯誤訊息必須包含「接下來該做什麼」。

  • ❌ Bad: Connection failed.

  • ✅ Good: Connection to DB failed, retrying in 5s. Please check network config. 精神:同理心。 給半夜修 Bug 的人一條明路。

✅ 2. Context is King

沒有 Trace ID 或 User ID 的 Log,在高併發環境下幾乎是雜訊。務必確保 Log 包含足夠的上下文屬性。

⛔ 3. 避免高成本操作

  • 不要 Log Request Body:除非在開發環境,否則這會導致儲存成本爆炸,且有洩漏 PII(個資)與 Secrets(金鑰)的風險。

  • 不要用 Log 做統計:如果你想知道「API 被呼叫幾次」,請用 Metrics,不要用 Log。

總結:Be Intentional (保持意圖)

整場討論可以用這兩個字總結:"Be Intentional"

Log 不再是廉價的 printf。每一行 Log 都有儲存成本、傳輸成本與認知成本。

  • 這條 Log 是給誰看的?(人還是機器?)

  • 它的目的是什麼?(除錯、稽核還是統計?)

  • 它包含了足夠的資訊嗎?

在 2025 年,寫好 Log 不僅是技術能力的展現,更是一種對系統架構與團隊協作的深層思考。


參考來源:Grafana & OpenTelemetry Community Call - Logging Best Practices

1.0K views

More from this blog

Claude Code 監控秘錄:OpenTelemetry(OTel/OTLP)實戰指南

稟告主公:此乃司馬懿進呈之兵書,詳解如何以 OpenTelemetry 陣法,令臥龍神算之一舉一動盡在掌握,知糧草消耗、察兵器效能、辨戰報異常,使主公運籌帷幄於大帳之中。 為何需要斥候情報? 司馬懿稟告主公: 臥龍神算(Claude Code)乃當世利器,然若無斥候回報,主公便如蒙眼行軍——兵器耗損幾何、糧草消費幾許、哪路斥候出了差錯,一概不知。臣以為,此乃兵家大忌。 無情報之弊,有四: 軍

Feb 19, 202610 min read184
Claude Code 監控秘錄:OpenTelemetry(OTel/OTLP)實戰指南

工程師的 Claude Code 實戰指南:從零開始到高效開發

工程師的 Claude Code 實戰指南:從零開始到高效開發 本文整合 Anthropic 官方 Best Practices 與社群實戰 Tips,帶你由淺入深掌握 Claude Code。 什麼是 Claude Code?為什麼值得學? 如果你還在用「複製程式碼貼到 ChatGPT,再複製答案貼回去」的工作流程,Claude Code 會讓你大開眼界。 Claude Code 是 Anthropic 推出的命令列工具,它直接活在你的 terminal 裡,能夠讀懂你的整個 codeb...

Feb 18, 20265 min read81
工程師的 Claude Code 實戰指南:從零開始到高效開發

System Design Interview Ch 12 Digital Wallet

確立問題與設計範疇 角色對話內容 面試者我們應該只關注兩個數位錢包之間的餘額轉帳操作嗎?我們是否需要擔心其他功能? 面試官讓我們只關注餘額轉帳操作。 面試者該系統需要支援多少 TPS(每秒交易次數)? 面試官讓我們假設是 1,000,000 TPS (每秒 100 萬次交易)。 面試者數位錢包對正確性有嚴格的要求。我們可以假設事務保證 就足夠了嗎? 面試官聽起來不錯。 面試者我們需要證明正確性嗎? 面試官這是一個很好的問題。正確性(Correctness)通常只有在交...

Feb 2, 202610 min read230
System Design Interview Ch 12 Digital Wallet

Claude Code 利用 Event-Driven Hooks 打造自動化開發大腦

在現代 AI 輔助開發中,我們不僅需要 AI 寫程式,更需要它懂規則、記性好,並且能自動處理那些繁瑣的雜事。透過 Claude Code Hooks 機制,我們可以介入 AI 的思考與執行迴圈,實現真正的「人機協作自動化」。 一、 動機與痛點:為什麼你需要介入 AI 的生命週期? 在預設狀態下,Claude Code 雖然強大,但它是「被動」且「無狀態」的,這導致了開發者常遇到以下痛點: 記憶重置 (Session Amnesia): 痛點:每次重啟終端機,AI 就像失憶一樣。 解法:你...

Jan 24, 20266 min read553
Claude Code 利用 Event-Driven Hooks 打造自動化開發大腦
M

MicroFIRE

71 posts