java - 使用 Docker 和 Kubernetes 进行日志记录。超过 16k 的日志被拆分
问题描述
我正在使用 Docker 版本 17.12.1-ce Kubernetes 版本 v1.10.11
我的应用程序将 Json 格式的日志打印到控制台。其中一个字段是 stackTrace,它可以包含一个巨大的 stackTrace。
问题是日志消息被分成两条消息。因此,如果我查看 /var/lib/docker/containers/ ... .log 我会看到两条消息。我读到这是出于安全原因,但我真的不明白我能用它做什么?
我应该削减我的堆栈跟踪吗?还是自定义尺寸?这是允许的吗?这是处理这个问题的正确方法吗?
p/s 我正在使用 json 文件日志记录驱动程序
解决方案
这是预期的行为。Docker 以 16K 的大小记录日志消息,因为日志消息有 16K 缓冲区。如果消息长度超过 16K,则应由 json 文件记录器拆分并在端点合并。
它确实将日志标记为部分消息,但实际上取决于重新组装的驱动程序/服务。
Docker Docs提到有不同的支持驱动程序。
对于您的架构(Stacktraces),这json-driver
可能不是最佳选择。
而且我在 github 上找到了这个线程,它添加了关于主题的附加信息(以及很多 offtop)。
编辑。
日志架构说,容器化应用程序写入的所有内容,stdout
由stderr
容器引擎处理和重定向到某个地方。
Docker 容器引擎将这两个流重定向到日志记录驱动程序,该驱动程序在 Kubernetes 中配置为以 json 格式写入文件。
注意:Docker json 日志记录驱动程序将每一行视为单独的消息。另一个特点是使用 Docker 日志记录驱动程序时,不直接支持多行消息。您需要在日志代理级别或更高级别处理多行消息。
我真的不明白我能用它做什么?
这是对 Docker 大小的限制。这是另一个很好的讨论,最终得出了使用 filebeat/fluentd 的想法。
看起来 Fluentbit 的Docker_mode选项可能会有所帮助,但我不确定您如何准确地解析容器日志。
我应该削减我的堆栈跟踪吗?
这取决于您是否需要在日志中进行跟踪。
还是自定义尺寸?我已经在 Docker 端搜索了某种“旋钮”来调整,但目前找不到。
看起来唯一的解决方案是使用一些可以组合分割线的日志处理工具。
推荐阅读
- arrays - Kotlin vararg 任意数组的数组
- latex - 如何使用 Rmarkdown-PDF 更改字体样式字体,已发送错误:“无法找到包含 Times New Roman 的包”
- django - 我正在创建一个表格并根据 + 或 - 值将文本着色为绿色或红色,有没有办法可以从数字中删除符号
- java - 从 BufferedInputStream 中读取 byte[]
- java - 有没有办法在 Java 中协调 Python C-Extensions
- java - Button ActionListener 导致大量错误,我不知道为什么
- sql-server - Flyway 是否有我们可以在 SQL 迁移中使用的“数据库名称”占位符?
- android - 如何在 android 和 ios 上运行 Angular 7 应用程序?
- xamarin - Xamarin.Forms 应用恢复时恢复导航堆栈
- python - 我可以在没有 Python 文件的情况下创建 sqlite3 连接吗?