Объединение сжатых логов Apache

Мы вращаем и сжимаем наши журналы Apache каждый день, но становится очевидно, что этого недостаточно. Размер несжатого журнала составляет около 6 ГБ, что приближается к заполнению нашего раздела журнала (да, мы увеличим его в будущем!), А также требует много времени и ресурсов процессора для сжатия каждый день. Мы должны создавать gziped-журнал для каждого дня для обработки нашей статистики. Очевидно, что мы могли бы переместить наши журналы в раздел с большим пространством, но я также хочу распределить накладные расходы на сжатие в течение дня.

Используя ротационные журналы Apache, мы можем вращать и сжимать журнал чаще, скажем, ежечасно, но как я могу объединить все ежечасно сжатые журналы в работающий сжатый журнал за день, не распаковывая предыдущие журналы? Я не хочу распаковывать данные за 24 часа и перепаковывать их, потому что в этом есть все недостатки нашего текущего решения.

Gzip, кажется, не предлагает никаких дополнений или конкатенаций, но, возможно, я упустил что-то очевидное. Этот вопрос предполагает, что прямая конкатенация оболочек "работает" в том смысле, что архив может быть распакован, но это gzip -l не работает, кажется немного хитрым.

В качестве альтернативы, возможно, это все еще плохой способ делать вещи. Другие предложения приветствуются - наши единственные ограничения - это относительно небольшие разделы журнала и необходимость предоставлять ежедневный сжатый журнал.

4 ответа

Решение

Страница man 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-х сжатых лог-файлов будет получен файл, практически идентичный по размеру с одним архивированным архивом из всех 24 оригинальных файлов.

CustomLog Директива позволяет вам указать команду, в которую передаются журналы, а не обычный файл журнала.

Вы можете, например, написать сценарий оболочки, который просто сжимает все, что получает от stdin, в файл, который вы указываете в качестве аргумента:

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

Вероятно, не стоит объединять это с rotatelogs, поскольку это может повредить архив, но вы можете относительно легко подражать его поведению.

Затем вы настраиваете Apache так:

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

Проверьте это! Буферизация gzip может быть проблемой.

Другие вопросы по тегам