Log4perl是一個偉大的日誌記錄工具。如何將Perl警告捕獲到Log4perl日誌中?
warnings附註也是一個必不可少的工具。
但是,當Perl腳本作爲守護程序運行時,Perl警告將打印到STDERR中,在這些腳本中沒有人可以看到它們,而不是在相關程序的Log4perl日誌文件中。
有沒有辦法將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.
並且日誌文件不會收到此警告。
您看到的警告是編譯器警告。在BEGIN塊中設置'$ SIG {__ WARN __}'處理程序:'my $ logger; BEGIN {$ logger = get_logger('Foo :: Bar'); $ SIG {__ WARN__} = sub {$ logger-> warn(「WARN @_」);' – daotoad 2010-01-17 23:25:40
對!感謝所有人的答案,使用BEGIN塊中的$ SIG {__ WARN__}處理程序執行這個技巧,捕獲所有警告,包括編譯時警告。 – Freddie 2010-01-18 07:01:04
你可能已經接受了答案,說::) – 2010-01-18 17:20:10