2011-09-27 65 views
4

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

我的代码结构是这样的

我有Start.PL它验证一些参数。我有几个模块(PM),这是相通的),它创建日志对象文件(在这些PL和PM文件中使用)

我有一个Logger.PM中,我有一个方法InitiateLogger(

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

我把这种方法Logger::InitiateLogger();在Start.pl

这里是我的问题

  1. 我如何可以使用相同的$日志跨模块(PM文件)
  2. 我是否需要为此使用相同的包名?

如果有人澄清我这些问题,会不错。

回答

4

您可以宣告$logour包变量,并使用你需要的地方,使用它的详细全称。例如:

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需要记录器的每个软件包中制作一个别名。

+0

对不起,它的工作原理:-)我的错误。感谢您花时间解释 – KK99

+0

不客气^ _ ^。 –

0

使用全局变量,如,

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

所以,你可以访问变量$主::跨模块任何地方登录。因为它将保留在命名空间中。

+0

请问您能解释一下吗?不知何故,我没有得到点 – 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()。这将返回一个与当前软件包名称绑定的记录器,因此您可以在配置文件中打开或关闭该软件包的记录器。

+0

从来不知道它是辛格尔顿。感谢这一点。会检查你的建议。 – KK99

相关问题