我该如何在Perl中跨模块使用Log4Perl?

4

我计划在我的模块中使用Log4Perl进行日志记录。

我的代码结构如下:

我有一个Start.PL文件,用于验证一些参数。我有几个模块(PM)文件,它们是相互关联的(在这些PL和PM文件之间使用)。

我有一个Logger.PM文件,在其中有一个InitiateLogger()方法,用于创建日志对象。

 $log    = Log::Log4perl->get_logger("MyLog");

我在Start.pl中调用了这个方法Logger::InitiateLogger();

以下是我的问题:

  1. 我如何在模块(PM文件)之间使用相同的$log?
  2. 我需要使用相同的包名称吗?

如果有人能为我澄清这些问题,那就太好了。

3个回答

4

你可以使用 our$log 声明为包变量,并使用其冗长的完全限定名称在需要的地方使用实例:

Package::Name::$log->info( 'test' );

在类型环境变量赋值后,你可以使用别名来代替完全限定名称:

#!/usr/bin/env perl

package Package::Name;

use strict;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init( $ERROR );
our $log = get_logger();

package main;

use v5.12;
use strict;

*log = $Package::Name::log;
say $log;

这将产生:

Log::Log4perl::Logger=HASH(0x230ff20)

在您的情况下,Start.pl文件中记录器对象的完全限定名称是$main::log。 您可以使用*log = $main::log在每个需要记录器的包中创建一个别名。


抱歉,它可以工作了 :-) 是我犯了错误。感谢您花时间解释。 - KK99

4

实际上,Log4perl的工作方式是单例模式,get_logger()将会在程序中任何调用它的位置返回完全相同的对象。

use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init( $ERROR );

print Log::Log4perl->get_logger("MyLog"), "\n";

package Some::Other::Package;

print Log::Log4perl->get_logger("MyLog"), "\n";

这将打印(例如):
Log::Log4perl::Logger=HASH(0x15a9d48)
Log::Log4perl::Logger=HASH(0x15a9d48)

如果您想在所有模块中使用相同的 $log,只需在每个模块中调用 get_logger("MyLog")。

但是,如果您希望能够在特定模块中打开或关闭日志记录,则更好的方法可能是只调用不带参数的 get_logger()。这将返回一个与当前包名称绑定的记录器,因此您可以在配置文件中打开或关闭该包的记录器。


以前不知道它是单例模式。谢谢你的建议,我会去看看的。 - KK99

0

使用全局变量,例如:

$main::log = Log::Log4perl->get_logger("MyLog");

这样你就可以在模块的任何地方访问变量$main::log。因为它将在命名空间中维护。


你能否请再详细解释一下?我有点不太明白。 - KK99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接