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

引入结构化日志

日志是可观察性的重要组成部分,也是调试的关键工具。但是,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 做出您的第一个贡献的绝佳且简单的方法!