Объединение сжатых логов 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 может быть проблемой.