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

介绍结构化日志

日志是可观测性的一个基本方面,也是调试的关键工具。但 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 做出首次贡献的绝佳且简单的方式!