我们每天都会轮换和压缩 Apache 日志,但很明显这还不够频繁。未压缩的日志大约有 6G,几乎填满了我们的日志分区(是的,我们将来会把它弄得更大!),而且每天压缩需要大量时间和 CPU。我们必须每天生成一个 gzip 压缩日志以供统计处理。显然,我们可以将日志移动到具有更多空间的分区,但我还想将压缩开销分散到一整天。
使用 Apache 的旋转日志我们可以更频繁地轮换和压缩日志(比如每小时一次),但是我怎样才能将所有每小时压缩的日志连接成当天运行的压缩日志,没有解压以前的日志?我不想解压 24 小时的数据并重新压缩,因为这具有我们当前解决方案的所有缺点。
Gzip 似乎不提供任何附加或连接选项,但也许我忽略了一些显而易见的东西。这个问题建议直接使用 shell 连接“有效”,因为可以解压缩存档,但不起作用gzip -l
似乎有点不可靠。
或者,这也许仍然是一种糟糕的做法。欢迎提出其他建议——我们唯一的限制是我们的日志分区相对较小,并且需要提供每日压缩日志。
答案1
这gzip 手册页应该有你想要的,但你可以直接将它们连接起来:
cat file1.gz >> file2.gz
gzip -c file1 >> file2.gz
压缩效果不如只压缩一个文件那么好,但您可以使用以下方法恢复:
zcat old.gz | gzip > new.gz
答案2
gzip 不在乎。您可以连接经过 gzip 压缩的文件,效果就像您先将它们连接起来,然后再进行 gzip 压缩一样。
$ echo foo |gzip >/tmp/log.gz
$ echo bar |gzip >>/tmp/log.gz
$ zcat /tmp/log.gz
foo
bar
答案3
只需将压缩文件打包在一起即可。这实际上是一个连接过程,并将它们逻辑地分组在一起。这样做与将它们解压缩/重新压缩在一起之间的文件大小差异几乎为零。
与非平凡日志文件一样,将 24 个经过 gzip 压缩的日志文件放在一起将生成一个文件,其大小与所有 24 个原始文件的单个 gzip 压缩档案几乎相同。
答案4
该CustomLog
指令允许您指定将日志传送到的命令,而不是通常的日志文件。
例如,你可以编写一个 shell 脚本,简单地将它从 stdin 中获取的所有内容压缩到你指定为参数的文件中:
#!/bin/sh
gzip -c >> $1
将其与 结合起来可能不是一个好主意rotatelogs
,因为这可能会损坏档案,但您可以相对轻松地模拟其行为。
然后像这样配置 Apache:
Customlog "|/usr/local/bin/gzip_log.sh /var/log/apache/access.log" combined
测试一下!gzip 的缓冲可能是一个问题。