首页 > 解决方案 > 如何在 Kubernetes 中使日志消息静音?

问题描述

我有一个在 Kubernetes 中运行的 python 应用程序。该应用程序有一个 ping 健康检查,它通过 REST 调用频繁调用,并检查该调用是否返回 HTTP 200。当我通过日志控制台查看 Kubernetes 日志时,这会使 Kubernetes 日志变得混乱。

函数定义如下所示:

def ping():
    return jsonify({'status': 'pong'})

如何使特定呼叫不显示在日志中?有没有办法可以把它放在健康检查功能之上的代码中,比如 python 装饰器?或者 Kubernetes 控制台中是否有一个选项可以配置为忽略此调用?

标签: kubernetes

解决方案


在 kubernetes 中,容器中您拥有stdoutstderr将进入 kubernetes 日志的所有内容。从 kubernetes 日志中排除 ping 调用删除日志的唯一方法health-check是,在您的应用程序中,您应该将这些 ping 调用的输出重定向到 say 中的某个文件/var/log/。这将有效地health-checkstdout.

一旦输出不在 Pod 中stdout或不在stderrPod 中,Pod 日志将不会包含来自该特殊的日志health-check

您还可以使用 sidecar 容器来简化应用程序日志,例如,如果您不希望kubectl logs输出应用程序的所有日志。你可以写那些文件。

正如 Kubernetes 官方文档中所述:

通过让 sidecar 容器流式传输到它们自己的 stdout 和 stderr 流,您可以利用 kubelet 和每个节点上已经运行的日志代理。Sidecar 容器从文件、套接字或日志中读取日志。每个单独的 sidecar 容器将日志打印到其自己的 stdout 或 stderr 流。

这种方法允许您从应用程序的不同部分分离多个日志流,其中一些可能不支持写入 stdout 或 stderr。重定向日志背后的逻辑很少,因此几乎不会产生重大开销。

更多关于 Kubernetes 日志的信息,请参考官方文档:

https://kubernetes.io/docs/concepts/cluster-administration/logging/


推荐阅读