Мы обновляем и сжимаем наши журналы Apache каждый день, но становится очевидным, что этого недостаточно часто. Несжатый журнал имеет размер около 6 ГБ, что приближается к заполнению нашего раздела журнала (да, в будущем мы его увеличим!), А также требует много времени и ресурсов процессора для сжатия каждый день. Мы должны создавать журнал в формате gziped на каждый день для обработки нашей статистики. Очевидно, мы могли бы переместить наши журналы в раздел с большим пространством, но я также хочу распределить накладные расходы на сжатие в течение дня.
Используя Apache ротация журналов мы можем вращать и сжимать журнал чаще - скажем, ежечасно - но как я могу объединить все сжатые почасовые журналы в текущий сжатый журнал за день, без распаковывать предыдущие журналы? Я не хочу распаковывать данные за 24 часа и повторно сжимать их, потому что это имеет все недостатки нашего текущего решения.
Gzip, похоже, не предлагает никаких опций добавления или объединения, но, возможно, я пропустил что-то очевидное. Этот вопрос предполагает, что прямая конкатенация оболочки "работает" в том смысле, что архив можно распаковать, но gzip -l
не работает кажется немного изворотливым.
С другой стороны, возможно, это все еще плохой способ делать что-то. Приветствуются и другие предложения - наши единственные ограничения - это относительно небольшие разделы журнала и необходимость предоставлять ежедневный сжатый журнал.
В страница руководства по gzip должно иметь то, что вы хотите, но вы можете напрямую объединить их:
cat file1.gz >> file2.gz
gzip -c file1 >> file2.gz
Сжатие не так хорошо, как если бы это был сжат только один файл, но вы можете восстановить его с помощью:
zcat old.gz | gzip > new.gz
gzip все равно. Вы можете объединить сжатые файлы, и это будет точно так же, как если бы вы объединили их, а затем сжали их.
$ echo foo |gzip >/tmp/log.gz
$ echo bar |gzip >>/tmp/log.gz
$ zcat /tmp/log.gz
foo
bar
Просто заархивируйте сжатые файлы вместе. По сути, это конкатенация, которая логически объединяет их. Разница в размере файла между этим и распаковкой / повторным сжатием их вместе практически равна нулю.
Как и в случае с нетривиальными файлами журнала, объединение 24 сжатых gzip-файлов журналов вместе создаст файл, практически идентичный по размеру одному сжатому gzip-архиву всех 24 исходных файлов.
В CustomLog
Директива позволяет вам указать команду, в которую будут отправляться журналы вместо обычного файла журнала.
Вы можете, например, написать сценарий оболочки, который просто архивирует все, что находится на стандартном вводе, в файл, указанный вами в качестве аргумента:
#!/bin/sh
gzip -c >> $1
Вероятно, не стоит сочетать это с rotatelogs
, поскольку это может повредить архив, но вы можете относительно легко подражать его поведению.
Затем вы настраиваете Apache так:
Customlog "|/usr/local/bin/gzip_log.sh /var/log/apache/access.log" combined
Проверьте это! Буферизация gzip может быть проблемой.