没有无限长时间滞后的对数压缩?

没有无限长时间滞后的对数压缩?

一种常见的情况是,一个程序或其他程序将日志信息写入标准输出,并且由于其容量较大,我通过 gzip 将其传输到磁盘。

不幸的是,gzip 和大多数类似的压缩程序并不觉得有义务刷新它们的输出 - 如果程序冻结,即使它在此之前将大量高度相关的调试信息打印到标准输出,即使它刷新了标准输出以便 gzip 获得它,gzip 也会无限期地保留其数据。

我想要一些像 gzip 这样的东西(未压缩的数据在 stdin 上,压缩的数据到磁盘) - 但如果太长时间没有得到任何东西,它只会刷新其输出。

我知道可以构建支持所有这些功能的复杂日志系统 - 但是通过定期刷新这个小修复,这种非常简单的解决方案就可以正常工作。

是否有这样的程序,或者我运气不好?

答案1

通常,日志会被写入磁盘,然后守护进程会不时轮换日志,压缩旧日志以节省空间。我建议在这里采用类似的策略。

您的问题部分可能是 gzip 需要一定量的数据来搜索标记,然后才能开始压缩流。如果您希望在输出时进行压缩,您可以考虑在写入日志之前先对日志输出进行霍夫曼编码。霍夫曼很容易解码,并且有类似的实用程序压缩文件; 插头已做好哈夫曼库拉入你的程序中。

答案2

如果我没记错的话,gzip/bzip 会编写一个压缩过程中使用的标记字典,然后写入该字典和生成的文件。由于您的 syslog 进程正在接受数据,但从不告诉您的管道它已完成文件,因此您的 gzip/bzip 进程正在等待文件结束,以便它可以快速构建字典、压缩并写入文件。

如果您可以告诉 syslog 守护进程偶尔关闭管道进程,则 gzip/bzip 将处理并写入文件,但是,现在您面临的问题是您不能直接将数据附加到该压缩文件中。据我所知,没有任何 syslog 守护进程支持流式压缩。我知道有人为 syslog-ng 编写了一个实验性补丁,但在 Google 上粗略搜索了几次都没有找到它。

正如克里斯提到的,更常见的是写入数据,并在每晚/每小时轮换时对其进行压缩。

答案3

由于没有现成的可用程序,我自己写了一个

相关内容