Log4perlの厚意により、ログを追加した Perl スクリプトがあります。
スクリプト自体は長時間実行され、ログのローテーション/アーカイブも毎日実行する必要があります。
Log::Dispatch::FileRotatelogadm
を使用するのではなく、組み込みの Solaris を使用することにしました。
- 必要な Perl の依存関係の数を減らそうとしています。
- アプリの外部で 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 のいずれかで、ここで明らかに欠けているものはありますか?