3

Log4perlの厚意により、ログを追加した Perl スクリプトがあります。

スクリプト自体は長時間実行され、ログのローテーション/アーカイブも毎日実行する必要があります。

Log::Dispatch::FileRotatelogadmを使用するのではなく、組み込みの Solaris を使用することにしました。

  1. 必要な Perl の依存関係の数を減らそうとしています。
  2. アプリの外部で OS レベルでそれを行うことが、推奨される/最も堅牢なアプローチであるという印象を受けます。

ローテーションの一環として、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 プロセスが死んでいるように見えます。これは、USR1 をキャプチャするように Log4perl を構成したかどうかに関係なく発生します。

USR2も使ってみましたが、同じ効果です。

Log4perl、Perl、Solaris のいずれかで、ここで明らかに欠けているものはありますか?

4

1 に答える 1

0

DEBUGLOG の 2 番目の構成セットにはまだ 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 に答える