Log4perl位于具有自定义附加器文件名的包中

ymzxtsji  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(108)

我想在一个包中使用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中,它就可以正常工作。
  • 如果我在MyPackage.pm内的log_conf中放置一个硬编码文件名,它就可以正常工作。

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

sgtfey8w

sgtfey8w1#

sub { return getLogFileName(); }

根据错误消息,在main包的范围内计算并执行此子例程,其中没有getLogFileName()子例程。

sub { return MyPackage::getLogFileName(); }

将允许它调用预期的函数。

相关问题