限制docker日志记录

3

我有一个运行用户代码的应用程序。我想确保Docker没有收集太多日志,因为我会丢弃大部分内容。为此,我尝试使用max-sizemax-file日志选项仅获取用户输出的最后几KB,并丢弃其余部分,但这似乎无效。

如果我执行以下操作:

$ docker run --log-opt max-size=2 --log-opt max-file=1 python:2 python -c "for i in range(10): print i"
0
1
2
3
4
5
6
7
8
9

接着它仍会在屏幕上打印完整的输出。如果我在主机上手动检查日志,我可以看到带有完整输出的文件。

在这种情况下,我不应该只得到9\n吗?我在这里做错了什么?


您正在使用的选项是针对文件大小和文件数量的。最大大小应为k/m/g。即使设置了这个,您也无法预测确切的行数。这是根据文件大小来确定的。 - Shibashis
1个回答

6
Dockers的JSON文件日志选项不会影响流式传输到docker客户端的标准输出和错误输出。在前台运行时,您将看到完整的输出。
当您运行docker logs时,信息将从文件中获取。
最大大小需要一个单位。千字节、兆字节或千兆字节。
--log-opt max-size=[0-9+][k|m|g]

这将设置JSON日志文件的大小,因此与仅有行长度相比,还有额外的元数据对文件大小有贡献。
{"log":"1\n","stream":"stdout","time":"2016-05-30T07:39:31.265191929Z"}

您应该将最多14个日志条目适合1k的空间。无论Docker的日志轮换是否准确,都是另一回事。

在任何情况下,处理小于4k的文件大小可能是浪费时间。


我同意这个例子有点牵强(我们不打算只保存2个字节的输出 ;-)。你说的似乎是有效的,只是没有保存最后的 N[k|m|g] 字节。日志会滚动并且至多保存 N[k|m|g] 字节的用户输出。也就是说,它不是按照先进先出的循环缓冲区实现的。在文档中可以更好地解释这一点。 - André Anjos
这是Unix文件日志记录的一个相当标准的设置。循环文件缓冲区可能较少见,因为标准的Linux文件系统没有提供。内核可以使用小型内存缓冲区。你可能想尝试journald logger,因为它可以在不需要设置任何东西的情况下记录到环形缓冲区。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接