如何在Perl中的模块之间使用Log4Perl?

时间:2011-09-27 11:59:02

标签: perl logging log4perl

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

我的代码结构就像这样

我有Start.PL验证一些参数。我有几个相互链接的模块(PM)文件(用于这些PL和PM文件)

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

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

我在Start.pl

中调用此方法Logger::InitiateLogger();

以下是我的问题

  1. 如何在模块(PM文件)中使用相同的$ log
  2. 我是否需要为此使用相同的包名?
  3. 如果有人向我澄清这些要点,那就太好了。

3 个答案:

答案 0 :(得分: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中的logger对象的完全限定名称为$main::log。 您可以使用*log = $main::log在需要记录器的每个包中创建别名。

答案 1 :(得分: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()。这将返回一个与当前包名绑定的记录器,因此您可以在配置文件中打开或关闭该包的记录器。

答案 2 :(得分:0)

使用全局变量,例如

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

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