在 Perl 中,有没有办法知道哪个 .pl 脚本初始化了这个模块实例?
具体来说,我想获取调用模块的脚本的名称,该模块有一个Log4perl
对象。这样,我就会知道我想在模块中写入哪个 .log 文件。
我做错了吗?如果我$logger
在 .pl 脚本中定义 ,模块内的任何$logger
调用都会写入与调用脚本相同的 .log 文件吗?
我还没有任何示例代码,但一直在阅读Log4perl
. 基本上,如果我将一个 Appender 设置为一个文件 ,caller.log
这是我的调用脚本的文件追加器caller.pl
,我希望自定义导入模块中定义的任何日志记录也写入caller.log
(如果可能的话,隐式地 - 显然我可以初始化模块实例时只需传递日志名称的名称)。
如果不传递参数来指定模块应该写入哪个 File Appender,这是否可能?不只Log4perl
使用一个$logger
实例?
另外,让我知道我是否有出路,以及我是否应该考虑其他方法。
谢谢
编辑:对不起,在我发布这个之后,我查看了相关链接,我想我的搜索措辞不正确。看起来这是一个很好的解决方案:Self logging Perl modules (without Moose)
不过,如果有人有任何其他想法,请告诉我。
编辑 2:终于测试了,并让它按我想要的方式工作——也比想象的要容易得多!
这是我的设置,差不多:
模块.pm
package Module;
use Log::Log4perl qw(get_logger :levels);
use Data::Dumper;
my $logger = get_logger("Module");
sub new {
my ($class, $name) = @_;
my @caller = caller(0);
$logger->debug("Creating new Module. Called by " . Dumper(\@caller));
my $object = { 'name' => $name };
return bless($object, $class);
}
调用者.pl
use Module;
use Log::Log4perl qw(get_logger :levels);
use Data::Dumper;
my $PATH = "$ENV{'APPS'}/$ENV{'OUTDIR'}";
my $SCRIPT = "caller";
my $logger = get_logger("Module");
$logger->level($DEBUG);
my $file_appender = Log::Log4perl::Appender->new("Log::Dispatch::File",
filename=> "$PATH/$SCRIPT.log",
mode => "append",);
$logger->add_appender($file_appender);
my $layout = Log::Log4perl::Layout::PatternLayout->new("%d %p> %F{1}:%L %M - %m%n");
$file_appender->layout($layout);
my $lib = Module->new('Chris');
$logger->info(Dumper($lib));