连接gziped Apache日志

我们每天轮换和压缩我们的Apache日志,但是显然这不够频繁。 一个未压缩的日志大约是6G,它正在接近填充我们的日志分区(是的,我们将在未来更大!),以及花费大量的时间和CPU来压缩每一天。 我们必须每天为我们的统计处理生成一个gziped日志。 显然,我们可以将日志移动到更多空间的分区上,但是我也希望在整个一天中分散压缩开销。

使用Apache的rotatelogs,我们可以更频繁地旋转和压缩日志 – 每小时说一次 – 但是如何将所有的每小时压缩日志连接到一天中正在运行的压缩日志中, 而不需要解压缩以前的日志呢? 我不想解压缩24小时的数据并重新压缩,因为这有我们目前的解决scheme的所有缺点。

Gzip似乎没有提供任何追加或连接选项,但也许我已经错过了明显的东西。 这个问题表明,直接shell连接“起作用”,归档文件可以解压缩,但gzip -l不起作用似乎有点不妥。

或者,这也许是一个不好的做法。 其他build议是受欢迎的 – 我们唯一的限制是我们相对较小的日志分区和需要提供每日压缩日志。

gzip手册页应该有你想要的,但你可以直接连接它们:

 cat file1.gz >> file2.gz gzip -c file1 >> file2.gz 

压缩不如仅压缩一个文件那么好,但可以通过以下方法恢复:

 zcat old.gz | gzip > new.gz 

gzip不在乎。 你可以连接gzip文件,就好像你连接了它们,然后gzip它们。

 $ echo foo |gzip >/tmp/log.gz $ echo bar |gzip >>/tmp/log.gz $ zcat /tmp/log.gz foo bar 

只需将gzip文件放在一起即可。 这实际上是一个连接,并将它们逻辑地分组在一起。 这样做和解压缩/重新压缩在一起的文件大小差异几乎为零。

如同使用不平凡的日志文件一样,将24个压缩的日志文件同时压缩会产生一个与所有24个原始文件的单个gzip压缩文件几乎相同的文件。

CustomLog指令允许你指定一个日志pipe理的命令,而不是通常的日志文件。

例如,您可以编写一个shell脚本,将它在标准input上获得的所有内容gzip压缩到您指定为参数的文件上:

 #!/bin/sh gzip -c >> $1 

将它与rotatelogs结合起来可能不是一个好主意,因为这可能会破坏归档,但是可以相对容易地模拟它的行为。

然后你像这样configurationApache:

 Customlog "|/usr/local/bin/gzip_log.sh /var/log/apache/access.log" combined 

testing这个! gzip的缓冲可能是一个问题。