Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Kubernetes中JSON日志记录的最佳实践_Docker_Kubernetes_Logging_Devops - Fatal编程技术网

Docker Kubernetes中JSON日志记录的最佳实践

Docker Kubernetes中JSON日志记录的最佳实践,docker,kubernetes,logging,devops,Docker,Kubernetes,Logging,Devops,我正在开发一个应用程序,其日志包含用于度量目的的自定义字段。 因此,我们以JSON格式生成日志,并将其发送到Elasticsearch集群。 我们目前正在将应用程序从本地Docker节点迁移到我们组织的Kubernetes群集。 我们的集群使用Fluentd作为守护程序,将所有pod中的日志输出到我们的Elasticsearch集群。 设置与此类似: 我正在尝试找出从我们的应用程序发送日志的最佳做法。我的两项要求是: 日志是否以JSON格式正确格式化。我不希望它们嵌套在持久化文档的msg字段中

我正在开发一个应用程序,其日志包含用于度量目的的自定义字段。 因此,我们以JSON格式生成日志,并将其发送到Elasticsearch集群。 我们目前正在将应用程序从本地Docker节点迁移到我们组织的Kubernetes群集。 我们的集群使用Fluentd作为守护程序,将所有pod中的日志输出到我们的Elasticsearch集群。 设置与此类似:

我正在尝试找出从我们的应用程序发送日志的最佳做法。我的两项要求是:

  • 日志是否以JSON格式正确格式化。我不希望它们嵌套在持久化文档的
    msg
    字段中
  • 我可以运行
    kubectl logs-f
    并以可读文本格式查看日志
  • 目前,如果我不做任何事情,让守护程序发送日志,它将无法满足这两个要求

    我想到的最好的解决方案是让Kubernetes集群的管理员用Fluentbit替换Fluentd日志记录。 然后,我可以按如下方式配置部署:

    apiVersion:apps/v1 种类:部署 元数据: 名称:示例应用程序 标签: 应用程序:示例应用程序 注释: fluentbit.io/parser-example-app:json fluentbit.io/exclude-send-logs:“true” 规格: 选择器: 火柴标签: 应用程序:示例应用程序 模板: 元数据: 标签: 应用程序:示例应用程序 规格: 容器: -名称:示例应用程序 图片:myapp:1.0.0 体积数量: -名称:应用程序日志 装载路径:“/var/log/app” -名称:尾木 图片:busybox args:[/bin/sh,-c,'tail-f/var/log/example-app.log'] 体积数量: -名称:应用程序日志 装载路径:“/var/log/app” 卷数: -名称:应用程序日志 emptyDir:{} 然后,日志以正确的JSON格式发送到Elasticsearch,我可以运行
    kubectl日志-f example app-c tail log
    以可读的格式查看它们

    这是最好的做法吗?我是否缺少一个更简单的解决方案? Fluentd是否支持其他替代方案


    我很高兴在这里发表您的意见:)

    这里没有一个好的选择不会消耗大量CPU。除了上面提到的解决方案之外,我能建议的最接近的事情是反转它,其中主输出流是未格式化的,并且运行Fluent*(通常是Bit)是辅助文件流上的一个侧车。不过也没什么好的

    实际上,我们大多数人只是将输出设置为JSON格式,在极少数情况下,我们需要在正常UI(Kibana、Grafana等)之外手动插入日志,我们只是处理这些麻烦


    从理论上讲,您还可以使“人类”格式具有足够的机器可解析性,以允许查询。通常的选择是“logfmt”,即
    key=value
    对。因此,我在logfmt-y服务上的日志行看起来像
    timestamp=2021-05-15T03:48:05.171973Z level=info event=“some message”otherkey=1 foo=“bar baz”
    。这非常简单,可以手动阅读,但也可以高效地解析。

    将格式更改为logfmt实际上是一个非常好的主意。老实说,我不知道这种格式,或者至少不知道它有名字。我想知道它是否仍然需要我对Fluentd的配置进行任何更改。我不想修改它,因为它是由it团队管理的,而我是开发团队的成员。我们甚至没有修改它的权限,所以我不希望我做的每一个小更改都依赖于它们。我将它与Promtail/Loki一起使用,所以不确定在这方面,Loki会在后端执行所有解析和其他操作,所以Promtail只会将数据逐字复制到它,而不管你说的是什么格式。您可以和他们讨论如何配置它来检查pod注释,以决定使用哪个日志配置并通过它处理不同的格式,或者至少我模糊地记得上次使用Fluentd时是这样做的。