Log4perlは、ロギング用の優れたツールです。
warningsプラグマも不可欠なツールです。
ただし、Perl スクリプトがデーモンとして実行されている場合、Perl の警告は、関連するプログラムの Log4perl ログ ファイルではなく、誰も見ることができない STDERR に出力されます。
Perl の警告を Log4perl ログに記録する方法はありますか?
たとえば、次のコードは問題なくログ ファイルに記録されますが、これがデーモンとして実行された場合、Perl の警告はログに含まれません。
#!/usr/bin/env perl
use strict;
use warnings;
use Log::Log4perl qw(get_logger);
# Define configuration
my $conf = q(
log4perl.logger = DEBUG, FileApp
log4perl.appender.FileApp = Log::Log4perl::Appender::File
log4perl.appender.FileApp.filename = test.log
log4perl.appender.FileApp.layout = PatternLayout
);
# Initialize logging behaviour
Log::Log4perl->init( \$conf );
# Obtain a logger instance
my $logger = get_logger("Foo::Bar");
$logger->error("Oh my, an error!");
$SIG{__WARN__} = sub {
#local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
$logger->warn("WARN @_");
};
my $foo = 100;
my $foo = 44;
これはまだSTDERRに出力されます:
"my" variable $foo masks earlier declaration in same scope at log.pl line 27.
また、ログ ファイルはこの警告をキャッチしません。