Почему USR1, кажется, убивает Perl, а не воссоздает файл журнала? - PullRequest
3 голосов
/ 03 марта 2011

У меня есть Perl-скрипт, к которому я добавил логирование, любезно предоставлено Log4perl .

Сам скрипт долго выполняется, и нам также нужно выполнить ротацию журнала /ежедневное архивирование.

Я решил использовать встроенный Solaris logadm, а не Log :: Dispatch :: FileRotate , поскольку

  1. мы пытаемся уменьшить количество необходимых нам Perl-зависимостей, и
  2. У меня складывается впечатление, что делать это на уровне операционной системы вне вашего приложения - предпочтительный / наиболее надежный подход.

В рамках ротации мне также нужно получить скрипт Perl для обновления дескриптора файла.В соответствии с Log4perl FAQ вы можете настроить его на прослушивание сигнала USR1 и воссоздать дескрипторы файлов для этого:

log4perl.rootLogger                                     = DEBUG, INFOLOG, DEBUGLOG

log4perl.appender.INFOLOG                               = Log::Log4perl::Appender::File
log4perl.appender.INFOLOG.filename                      = myprogram.info.log
log4perl.appender.INFOLOG.mode                          = append
log4perl.appender.INFOLOG.recreate                      = 1
log4perl.appender.INFOLOG.recreate_check_signal         = USR1
log4perl.appender.INFOLOG.layout                        = Log::Log4perl::Layout::PatternLayout
log4perl.appender.INFOLOG.layout.ConversionPattern      = %d [%p] (%F line %L) %m%n
log4perl.appender.INFOLOG.Threshold                     = INFO

log4perl.appender.DEBUGLOG                              = Log::Log4perl::Appender::File
log4perl.appender.DEBUGLOG.filename                     = myprogram.debug.log
log4perl.appender.DEBUGLOG.mode                         = append
log4perl.appender.INFOLOG.recreate                      = 1
log4perl.appender.INFOLOG.recreate_check_signal         = USR1
log4perl.appender.DEBUGLOG.layout                       = Log::Log4perl::Layout::PatternLayout
log4perl.appender.DEBUGLOG.layout.ConversionPattern     = %d [%p] (%F line %L) %m%n

Однако по какой-то причине всякий раз, когда я отправляюСигнал USR1 для процесса Perl, мой сценарий Perl просто завершается.

Я отправляю его с:

kill -s USR1 <pid>

Как только я это делаю, процесс Perl, похоже, умирает.Это происходит независимо от того, настроил ли я Log4perl для захвата USR1 или нет.

Я также пытался использовать USR2, тот же эффект.

Есть ли что-то очевидное, что я здесь упускаю, либо в Log4perl, либов Perl или Solaris?

1 Ответ

0 голосов
/ 06 марта 2011

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

# Your Log4perl config

Log::Log4perl::init( \$conf );

my $log = Log::Log4perl::get_logger("Foo::Bar");

while (1){
  $log->info("Important Info!");
  sleep 5;
}

Если это работает (у меня работало на Mac), значит, ваша система правильно отправляет сигналы, и это не Solaris. Затем вы можете сосредоточиться на том, что другой код может мешать с сигналом.

...