本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已失效。

结构化日志简介

日志是可观测性的重要方面,也是调试的关键工具。但传统上,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 做出第一次贡献的一个很棒且简单的方式!