使用Docker和Kubernetes登录拆分的日志超过16k

2020年8月17日 22点热度 0条评论

我在用
Docker版本17.12.1-CE
Kubernetes版本v1.10.11

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

问题在于该日志消息被拆分为两个消息。因此,如果我查看/ var / lib / docker / containers / ... .log,则会看到两条消息。我读到这样做是出于安全原因,但我真的不明白该怎么办?

我应该削减我的stackTrace吗?还是自定义尺寸?可以吗?这是解决此问题的正确方法吗?

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

解决方案如下:

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

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

Docker Docs提到存在受支持的不同驱动程序。

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

而且我发现this thread on github添加了有关主题的附加信息(以及许多offtop)。

编辑。

Logging Architecture表示,容器化应用程序写入stdoutstderr的所有内容均由容器引擎处理和重定向。

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

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

我真的不明白该怎么办?

这是对Docker大小的限制。 Here是另一个很好的讨论,最后以使用filebeat / fluentd的想法结尾。

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

我应该削减我的stackTrace吗?

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

还是自定义尺寸?
我已经在Docker方面搜索了某种“旋钮”进行调整,但到目前为止找不到任何。

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