Log4perl位于具有自定义appender文件名的包中



我想在包中使用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中,它工作得很好

关于如何修复错误有什么建议吗?

sub { return getLogFileName(); }

该子程序基于错误消息,在main包的范围内进行评估和执行,其中没有getLogFileName()子程序。使用完全限定的名称,如

sub { return MyPackage::getLogFileName(); }

将允许它调用所需的函数。

最新更新