我想在包中使用 Log4perl 將訊息記錄到自定義檔案名和螢屏上。
我的郵件檔案test.pl:
#!/usr/bin/env perl
use lib '.';
use MyPackage;
helloWorld();
我的包檔案MyPackage.pm:
package MyPackage;
use Exporter;
our @ISA= qw( Exporter );
our @EXPORT_OK = qw( helloWorld );
our @EXPORT = qw( helloWorld );
sub getLogFileName { return "log.txt"; }
my $log_conf = q(
log4perl.logger = ALL, App, Screen
log4perl.appender.App = Log::Log4perl::Appender::File
log4perl.appender.App.filename = sub { return getLogFileName(); }
log4perl.appender.App.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.App.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %p %l %m%n
log4perl.appender.Screen = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr = 0
log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout
);
use Log::Log4perl;
Log::Log4perl::init(\$log_conf);
my $logger = Log::Log4perl->get_logger("MyPackage");
sub helloWorld {
$logger->trace('this is a TRACE message');
$logger->debug('this is a DEBUG message');
$logger->info('this is an INFO message');
$logger->warn('this is a WARN message');
$logger->error('this is an ERROR message');
$logger->fatal('this is a FATAL message');
}
1;
運行test.pl列印出以下錯誤:
Undefined subroutine &main::getLogFileName called at (eval 6) line 1.
Compilation failed in require at ./test.pl line 4.
BEGIN failed--compilation aborted at ./test.pl line 4.
- 如果我將相同的包代碼放在里面
test.pl,它作業正常。 log_conf如果我在里面放置一個硬編碼的檔案名MyPackage.pm,它作業正常。
有關如何修復錯誤的任何建議?
uj5u.com熱心網友回復:
sub { return getLogFileName(); }
該子程式根據錯誤訊息在main沒有getLogFileName()子程式的包范圍內評估和執行。使用完全限定的名稱,而不是像
sub { return MyPackage::getLogFileName(); }
將允許它呼叫預期的功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506223.html
