3

在 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));
4

3 回答 3

2

$0包含脚本的路径。basename如果您想要文件名组件,可以使用 File::Basename's 。

于 2011-08-23T18:04:56.823 回答
2

你可以继承 Log4perl,覆盖它的构造函数。在您的自定义构造函数中,用于caller()获取调用构造函数的文件名并将其放入$self.

于 2011-08-23T14:29:02.667 回答
2

您可以将子例程挂钩放入@INC可以运行任意代码的程序中,如perldoc -f require. 例如:

# UseLogger.pm
package UseLogger;
sub import { unshift @INC, \&UseLogger::log_use }
sub log_use {
    my ($self, $filename) = @_;
    my @c = caller(0);
    print "Module $filename required in file $c[1] line $c[2]\n";
    return 0;
}
1;

$ perl -MUseLogger my_script.pl
Module feature.pm required in file my_script.pl line 2
Module Encode.pm required in file my_script.pl line 5
Module XSLoader.pm from /usr/lib/perl5/5.14.0/cygwin-thread-multi-64int/Encode.pm line 13
...
于 2011-08-23T16:10:11.223 回答