本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

介紹結構化日誌

日誌是可觀測性的一個基本方面,也是除錯的關鍵工具。但 Kubernetes 日誌傳統上是無結構字串,這使得任何自動化解析都變得困難,並且下游的處理、分析或查詢也難以可靠地進行。

在 Kubernetes 1.19 中,我們增加了對結構化日誌的支援,這些日誌原生支援(鍵、值)對和物件引用。我們還更新了許多日誌記錄呼叫,使得典型部署中超過 99% 的日誌量現在已遷移到結構化格式。

為了保持向後相容性,結構化日誌仍將以字串形式輸出,其中字串包含這些“鍵”=“值”對的表示。從 1.19 版本的 Alpha 階段開始,日誌也可以使用 `--logging-format=json` 標誌以 JSON 格式輸出。

使用結構化日誌

我們已向 klog 庫添加了兩個新方法:InfoS 和 ErrorS。例如,此 InfoS 呼叫

klog.InfoS("Pod status updated", "pod", klog.KObj(pod), "status", status)

將生成此日誌

I1025 00:15:15.525108       1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready"

或者,如果設定了 --logging-format=json 標誌,它將生成此輸出

{
  "ts": 1580306777.04728,
  "msg": "Pod status updated",
  "pod": {
    "name": "coredns",
    "namespace": "kube-system"
  },
  "status": "ready"
}

這意味著下游日誌工具可以輕鬆地攝取結構化日誌資料,而無需使用正則表示式解析非結構化字串。這還使日誌處理更容易,日誌查詢更健壯,日誌分析也更快。

透過結構化日誌,對 Kubernetes 物件的所有引用都以相同的方式結構化,因此您可以過濾輸出並僅記錄引用特定 Pod 的條目。您還可以找到指示排程程式如何排程 Pod、Pod 如何建立、Pod 的健康探針以及 Pod 生命週期中所有其他更改的日誌。

假設您正在除錯 Pod 的問題。使用結構化日誌,您可以只篩選那些引用感興趣的 Pod 的日誌條目,而無需在數千行日誌中掃描以查詢相關條目。

結構化日誌不僅在手動除錯問題時更有用,它們還支援更豐富的功能,例如日誌中的自動化模式識別或日誌和跟蹤資料的更緊密關聯。

最後,結構化日誌可以幫助降低日誌儲存成本,因為大多數儲存系統能夠更有效地壓縮結構化鍵值資料,而不是非結構化字串。

參與其中

雖然我們已經更新了典型部署中按日誌量計算的 99% 以上的日誌條目,但仍有數千條日誌待更新。選擇您想要改進的檔案或目錄,然後將現有日誌呼叫遷移到使用結構化日誌。這是您對 Kubernetes 做出首次貢獻的絕佳且簡單的方式!