Как я могу вращать и сжимать файлы журнала Log4perl?

Из того, что я могу сказать, ни Log4Perl, ни какой-либо из связанных с ним модулей в CPAN не поддерживает поворот и сжатие файлов журнала.

Вращение может быть выполнено с помощью:

Но ни один из модулей не поддерживает вращение и сжатие. (Log:: Dispatch:: FileRotate имеет его в списке задач, но в настоящее время он не реализован).

Это можно сделать с помощью стандартного средства Logrotate в Linux, используя либо Log:: Log4perl:: Appender:: Файл recreate_check_interval или recreate_check_signal.

Из начальных тестов похоже, что Logrotate с опцией delaycompress выполнит трюк - даже на машине с высокой нагрузкой, как только файл будет перемещен, log4perl продолжит запись в тот же дескриптор файла, пока не будет получен сигнал.

Однако, если delaycompress не используется и есть (даже небольшая задержка) между сжатием файла журнала и улавливанием сигнала программой Perl, некоторые данные регистрации могут быть потеряны.

Как вы думаете? Есть ли другие варианты, о которых мы не думали?

Ответ 1

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

Вы упомянули два метода, которые работают с logrotate в Linux, почему бы не использовать их? Часто задаваемые вопросы Log4perl описывают использование newsyslog, который является эквивалентом logrotate FreeBSD и предоставляет аналогичные функции.

Ответ 2

Задумывались ли вы о работе с поддерживателями Log:: Dispatch:: FileRotate, чтобы добавить недостающие функции и вам нужно? Это открытый источник.:)

Если вы не хотите иметь дело с этим, существуют различные консультации по поддержке CPAN, которые делают это для вас.

Ответ 3

Я связался с автором Log:: Dispatch:: FileRotate, как было предложено здесь, и объяснил причину, по которой сжатие еще не реализовано в Log:: Dispatch:: FileRotate.

В принципе, сжатие сразу после вращения может блокировать выполняемый процесс во время сжатия, которое довольно дорого.

Предлагаемые варианты состоят в том, чтобы разрешить пользователю Log:: Dispatch:: FileRotate выполнить произвольное приложение в файле сразу после ротации, тем самым выполняя его в другом неблокирующем процессе.

Другое предложение заключалось в том, что триггер файловой системы (например, inotify) запускает сжатие, когда файл закрыт для записи основным процесс.

Еще одно предложение - записать файл журнала, сжатый через канал gzip, или один из модулей perl gzip. Это работает, но вызывает некоторые проблемы (grep/less) не будет работать. zgrep и zless будут работать, но zgrep дает уродливое предупреждение, когда grepping на gzip файле, который все еще открыт для записи. Использование "хвоста" в файле также не будет работать, поэтому этот параметр не является практичным.