一种常见的情况是,一个程序或其他程序将日志信息写入标准输出,并且由于其容量较大,我通过 gzip 将其传输到磁盘。
不幸的是,gzip 和大多数类似的压缩程序并不觉得有义务刷新它们的输出 - 如果程序冻结,即使它在此之前将大量高度相关的调试信息打印到标准输出,即使它刷新了标准输出以便 gzip 获得它,gzip 也会无限期地保留其数据。
我想要一些像 gzip 这样的东西(未压缩的数据在 stdin 上,压缩的数据到磁盘) - 但如果太长时间没有得到任何东西,它只会刷新其输出。
我知道可以构建支持所有这些功能的复杂日志系统 - 但是通过定期刷新这个小修复,这种非常简单的解决方案就可以正常工作。
是否有这样的程序,或者我运气不好?
答案1
答案2
如果我没记错的话,gzip/bzip 会编写一个压缩过程中使用的标记字典,然后写入该字典和生成的文件。由于您的 syslog 进程正在接受数据,但从不告诉您的管道它已完成文件,因此您的 gzip/bzip 进程正在等待文件结束,以便它可以快速构建字典、压缩并写入文件。
如果您可以告诉 syslog 守护进程偶尔关闭管道进程,则 gzip/bzip 将处理并写入文件,但是,现在您面临的问题是您不能直接将数据附加到该压缩文件中。据我所知,没有任何 syslog 守护进程支持流式压缩。我知道有人为 syslog-ng 编写了一个实验性补丁,但在 Google 上粗略搜索了几次都没有找到它。
正如克里斯提到的,更常见的是写入数据,并在每晚/每小时轮换时对其进行压缩。
答案3
由于没有现成的可用程序,我自己写了一个。