Как я могу вращать и сжимать файлы журнала Log4perl?
Из того, что я могу сказать, ни Log4Perl, ни какой-либо из связанных с ним модулей в CPAN не поддерживают вращение и сжатие файлов журнала.
Вращение может быть выполнено с помощью:
Но ни один из модулей не поддерживает вращение и сжатие. (Log::Dispatch::FileRotate имеет его в своем списке задач, но в настоящее время он не реализован).
Это можно сделать с помощью стандартного средства Logrotate в Linux, используя либо Log::Log4perl::Appender::File's refreshate_check_interval, либо пересоздать_check_signal.
Из начальных тестов похоже, что использование Logrotate с опцией delaycompress сделает свое дело - даже на машине с высокой нагрузкой, так как после перемещения файла log4perl продолжит запись в тот же дескриптор файла, пока сигнал не будет обработан.
Однако если delaycompress не используется и между сжатием файла журнала и перехватом сигнала программой Perl существует (даже небольшая задержка), некоторые данные журнала могут быть потеряны.
Как вы думаете? Есть ли другие варианты, о которых мы не думали?
3 ответа
На протяжении многих лет я обнаружил, что вы почти всегда хотите использовать внешние методы для ротации файлов журнала с Log4perl. Вы просто избегаете множества тонких проблем (задержки журнала, проблемы с разрешениями), с которыми неизбежно сталкивается внутренний журнал.
Вы упомянули два метода, которые работают с logrotate в Linux, почему бы не придерживаться их? В FAQ по Log4perl описывается использование newsyslog, который является эквивалентом logbtate во FreeBSD и предоставляет аналогичные функции.
Задумывались ли вы о работе с сопровождающими Log::Dispatch::FileRotate, чтобы добавить функции, которые отсутствуют, и вам это нужно? В конце концов, это открытый исходный код.:)
Если вы не хотите заниматься этим самостоятельно, существуют различные консультационные службы поддержки CPAN, которые сделают это для вас.
Я связался с автором Log::Dispatch::FileRotate, как было предложено здесь, и он объяснил причину, по которой сжатие еще не реализовано в Log::Dispatch::FileRotate.
По сути, сжатие сразу после вращения может блокировать рабочий процесс во время сжатия, что довольно дорого.
Предложенные варианты состояли в том, чтобы позволить пользователю Log:: Dispatch:: FileRotate выполнить произвольное приложение для файла сразу после ротации, таким образом делая это в другом неблокирующем процессе.
Другое предложение заключалось в том, чтобы триггер файловой системы (например, inotify) запускал сжатие, когда файл закрыт для записи основным процессом.
Еще одно предложение - записать файл журнала, сжатый через канал gzip, или один из модулей perl gzip. Это работает, но вызывает некоторые проблемы (grep/less) не будет работать. zgrep и zless будут работать, но zgrep выдает ужасное предупреждение при поиске файла gzip, который все еще открыт для записи. Использование "хвоста" в файле также не сработает, поэтому эта опция не практична.