Как я могу вращать и сжимать файлы журнала Log4perl? - PullRequest
10 голосов
/ 09 февраля 2009

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

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

  1. Журнал :: Log4perl :: Appender :: File
  2. Вход :: Отправка :: FileRotate .

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

Это можно сделать с помощью стандартного средства Logrotate в Linux, используя либо Log :: Log4perl :: Appender :: File's refreshate_check_interval, либо пересоздать_check_signal.

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

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

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

Ответы [ 3 ]

5 голосов
/ 27 мая 2009

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

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

3 голосов
/ 13 февраля 2009

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

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

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

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

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

3 голосов
/ 09 февраля 2009

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

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

...