使用 Docker 和 Kubernetes 进行日志记录。分割的日志超过 16k

lio*_*tur 5 java logging docker kubernetes docker-engine

我使用的是 Docker 版本 17.12.1-ce Kubernetes 版本 v1.10.11

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

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

我应该切断我的 stackTrace 吗?或者定制尺寸?这是允许的吗?这是处理这个问题的正确方法吗?

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

Nic*_*ick 3

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

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

Docker 文档提到有不同的受支持驱动程序。

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

在 github 上发现了这个线程,它添加了有关主题的附加信息(以及很多非主流信息)。

编辑。

日志架构表示容器化应用程序写入的所有内容都由容器引擎处理和重定向到某处stdoutstderr

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

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

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

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

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

我应该切断我的 stackTrace 吗?

这取决于您是否需要日志中的跟踪。

或者定制尺寸?我已经搜索了某种“旋钮”来在 Docker 端进行调整,但目前还没有找到。

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