4

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

我的代码结构是这样的

我有 Start.PL 可以验证一些参数。我有几个相互关联的模块(PM)文件(在这些 PL 和 PM 文件中使用)

我有一个 Logger.PM,其中有一个创建日志对象的方法 InitiateLogger()

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

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

这是我的问题

  1. 如何跨模块使用相同的 $log(PM 文件)
  2. 我需要为此使用相同的包名吗?

如果有人澄清我这些观点会很好。

4

3 回答 3

4

您可以使用其详细的完全限定名称将实例声明$log为包变量并在任何需要的地方使用:our

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

您可以在 typeglob 分配后使用别名来代替完全限定名称:

#!/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.

于 2011-09-27T12:47:47.807 回答
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() 而不使用参数。这将返回一个与当前包名称相关的记录器,因此您可以在配置文件中打开或关闭该包的记录器。

于 2011-09-28T09:06:01.923 回答
0

使用全局变量,例如,

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

因此,您可以在模块的任何位置访问变量 $main::log。因为它将被维护在命名空间中。

于 2011-09-27T12:33:49.567 回答