3

我有一个已添加日志记录的 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

但是,由于某种原因,每当我向 Perl 进程发送 USR1 信号时,我的 Perl 脚本就会退出。

我发送它:

kill -s USR1 <pid>

一旦我这样做,Perl 进程似乎就死了。无论我是否将 Log4perl 配置为捕获 USR1,都会发生这种情况。

我也试过用USR2,效果一样。

在 Log4perl、Perl 或 Solaris 中,我在这里有什么明显的遗漏吗?

4

1 回答 1

0

在 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。然后,您可以专注于可能会干扰信号的其他代码。

于 2011-03-05T22:15:29.907 回答