Назад | Перейти на главную страницу

Сжатие журналов без бесконечно долгой задержки?

Распространенная ситуация состоит в том, что программа или другая программа записывает информацию журнала в stdout, и из-за ее объема я передаю ее через gzip по пути на диск.

К сожалению, gzip и большинство программ сжатия, подобные ему, не чувствуют себя обязанными когда-либо сбрасывать свой вывод - и если программа зависает, даже если она напечатала много очень важной отладочной информации в stdout непосредственно перед этим, и даже если она сбросила свой stdout, поэтому gzip получил это, gzip будет хранить свои данные бесконечно.

Я бы хотел здесь что-то вроде gzip (несжатые данные на stdin, сжатые данные на диск), но это просто сбрасывает его вывод, если он ничего не получает слишком долго.

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

Есть такая программа или мне не повезло?

Обычно журналы записываются на диск, затем демон периодически меняет журналы, сжимая старый журнал для экономии места. Я бы порекомендовал здесь аналогичную тактику.

Частично ваша проблема, вероятно, заключается в том, что gzip требуется определенный объем данных для поиска токенов, прежде чем он сможет начать сжатие потока. Вы можете рассмотреть возможность передачи вывода журнала через кодирование Хаффмана перед записью в журналы, если хотите, чтобы он сжимался на выходе. Хаффмана довольно легко расшифровать, и есть такие утилиты, как hffzip; вилка готова Библиотеки Хаффмана потянуть в свою программу.

Если я помню механизм этого, gzip / bzip записывает словарь токенов, используемых во время сжатия, затем записывает словарь и полученный файл. Поскольку ваш процесс системного журнала принимает данные, но никогда не сообщает вашему каналу, что он закончил файл, ваш процесс gzip / bzip ожидает этого конца файла, чтобы он мог быстро построить словарь, сжать и записать файл.

Если бы вы могли указать демону системного журнала время от времени закрывать конвейерный процесс, ваш gzip / bzip обрабатывал бы и записывал файл, но теперь проблема, с которой вы столкнулись, заключается в том, что вы не можете просто добавить данные в этот сжатый файл. Насколько мне известно, нет демонов системного журнала, поддерживающих сжатие потоковой передачи. Я знаю, что кто-то написал экспериментальный патч для syslog-ng, но несколько беглых поисков в Google его не нашли.

Как упоминает Крис, чаще всего данные записываются и сжимаются в ночной / почасовой ротации.

Так как для этого не было готовой программы, Я написал один сам.