Kubernetes引入结构化日志

2020-09-14 15:01:15 浏览数 (1)

作者:Marek Siarkowicz(谷歌)、Nathan Beach(谷歌)

日志是可观察性的一个基本方面,也是调试的一个关键工具。但是Kubernetes日志传统上是非结构化字符串,这使得任何自动解析都很困难,任何下游处理、分析或查询都很难可靠地完成。

在Kubernetes 1.19中,我们增加了对结构化日志的支持,它原生支持(键、值)对和对象引用。我们还更新了许多日志调用,这样在一个典型的部署中超过99%的日志量现在都迁移到了结构化格式。

为了保持向后兼容性,结构化日志仍将输出为字符串,其中字符串包含“key”=“value”对的表示。从1.19的alpha开始,日志也可以使用--logging-format=json标记以JSON格式输出。

使用结构化日志

我们向klog库添加了两个新方法:InfoS和ErrorS。例如,以下信息的调用:

代码语言:javascript复制
klog.InfoS("Pod status updated", "pod", klog.KObj(pod), "status", status)

将导致以下日志:

代码语言:javascript复制
I1025 00:15:15.525108       1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready"

或者,如果设置了--logging-format=json标志,则会产生如下输出:

代码语言:javascript复制
{
  "ts": 1580306777.04728,
  "msg": "Pod status updated",
  "pod": {
    "name": "coredns",
    "namespace": "kube-system"
  },
  "status": "ready"
}

这意味着下游的日志工具可以很容易地获取结构化日志数据,而不是使用正则表达式(regex)来解析非结构化字符串。这也使得处理日志更容易,查询日志更健壮,分析日志更快。

使用结构化日志,对Kubernetes对象的所有引用都以相同的方式进行结构化,因此你可以过滤引用特定pod的输出和日志条目。你还可以找到一些日志,这些日志指示调度器如何调度pod、如何创建pod、pod的运行状况探测以及pod生命周期中的所有其他更改。

假设你正在用pod调试一个问题。使用结构化日志,你可以筛选到仅引用感兴趣的pod的那些日志条目,而不需要扫描可能数以千计的日志行来查找相关的日志。

结构化日志不仅在手动调试问题时更有用,而且还支持更丰富的特性,如日志中的自动模式识别或日志和跟踪数据的更紧密的相关性。

最后,结构化日志可以帮助降低日志的存储成本,因为大多数存储系统压缩结构化的key=value数据比压缩非结构化的字符串更有效。

来参与

虽然在一个典型的部署中,我们已经按日志量更新了超过99%的日志条目,但仍然有数千个日志需要更新。选择一个你想要改进的文件或目录,并将现有的日志调用迁移到使用结构化日志。这是对Kubernetes做出第一份贡献的一种伟大而简单的方式!

0 人点赞