首页 > 解决方案 > 使用 Docker 和 Kubernetes 进行日志记录。超过 16k 的日志被拆分

问题描述

我正在使用 Docker 版本 17.12.1-ce Kubernetes 版本 v1.10.11

我的应用程序将 Json 格式的日志打印到控制台。其中一个字段是 stackTrace,它可以包含一个巨大的 stackTrace。

问题是日志消息被分成两条消息。因此,如果我查看 /var/lib/docker/containers/ ... .log 我会看到两条消息。我读到这是出于安全原因,但我真的不明白我能用它做什么?

我应该削减我的堆栈跟踪吗?还是自定义尺寸?这是允许的吗?这是处理这个问题的正确方法吗?

p/s 我正在使用 json 文件日志记录驱动程序

标签: javadockerloggingkubernetesdocker-engine

解决方案


这是预期的行为。Docker 以 16K 的大小记录日志消息,因为日志消息有 16K 缓冲区。如果消息长度超过 16K,则应由 json 文件记录器拆分并在端点合并。

它确实将日志标记为部分消息,但实际上取决于重新组装的驱动程序/服务。

Docker Docs提到有不同的支持驱动程序。

对于您的架构(Stacktraces),这json-driver可能不是最佳选择。

而且我在 github 上找到了这个线程,它添加了关于主题的附加信息(以及很多 offtop)。

编辑。

日志架构说,容器化应用程序写入的所有内容,stdoutstderr容器引擎处理和重定向到某个地方。

Docker 容器引擎将这两个流重定向到日志记录驱动程序,该驱动程序在 Kubernetes 中配置为以 json 格式写入文件。

注意:Docker json 日志记录驱动程序将每一行视为单独的消息。另一个特点是使用 Docker 日志记录驱动程序时,不直接支持多行消息。您需要在日志代理级别或更高级别处理多行消息。

我真的不明白我能用它做什么?

这是对 Docker 大小的限制。是另一个很好的讨论,最终得出了使用 filebeat/fluentd 的想法。

看起来 Fluentbit 的Docker_mode选项可能会有所帮助,但我不确定您如何准确地解析容器日志。

我应该削减我的堆栈跟踪吗?

这取决于您是否需要在日志中进行跟踪。

还是自定义尺寸?我已经在 Docker 端搜索了某种“旋钮”来调整,但目前找不到。

看起来唯一的解决方案是使用一些可以组合分割线的日志处理工具。


推荐阅读