使用Docker和Kubernetes进行日志记录.日志拆分超过16k



我正在使用Docker版本17.12.1-ceKubernetes verision v1.10.11

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

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

我应该剪下我的stackTrace吗?或者自定义尺寸?这是允许的吗?这是处理这个问题的正确方法吗?

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

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

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

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

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

我在github上发现了这个线程,它添加了关于主题的额外信息(以及许多非主流信息(。

编辑。

Logging Architecture表示,容器化应用程序写入stdoutstderr的所有内容都由容器引擎处理并重定向到某个位置。

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

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

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

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

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

我应该剪切stackTrace吗?

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

或者自定义大小?我已经在Docker侧搜索了一些可以调整的"旋钮",但到目前为止还找不到。

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

容器运行时将每个日志行的日志行限制为16k。如果应用程序中的日志超过此限制,则日志将被拆分为多行。

你有两个选项

  • 当某个日志收集器/处理器(如fluentd(从中读取日志时,请插入日志/var/lib/docker/containers/*.log
  • OR将其合并到日志聚合器中工具(splunk,ELK(读取日志。(这不是很有效,因为每次读取日志时都必须执行concat操作(

让我们举下面的例子。假设日志非常大,这会导致拆分为两行。这导致日志的一部分在第1行(前16k(,而剩余在第2行。现在json格式也被破坏了。

2022-05-26 00:36:53,066 INFO job.logger - {"queryId":"1d71345c-d095-c50f-3ed4-52bbf6073100","context":"[system]","queryText":"SELECT * FROM schemata","setupTime":0,"waitTime":0,"start":1653525410464,
"end":1653525410499,"memoryAllocated":0} job.logger.EOL

请注意,在行的末尾有一些特定的关键字(从上面开始,例如:"job.logger.EOL"(将使您可以在日志收集器或日志聚合器中轻松地将这两行缝合在一起。

如果您使用fluentd,您可以使用concat将这两行缝合在一起,然后再将其发送到日志聚合器。

<filter docker.log>
@type concat
key loga
separator ""
multiline_start_regexp /job.logger/
multiline_end_regexp /job.logger.EOL/
</filter>

相关内容

  • 没有找到相关文章

最新更新