如何在Perl中跨模块使用Log4Perl?
我计划在我的模块中使用Log4Perl进行日志记录 我的代码结构是这样的 我有Start.PL,它验证了一些参数。我有几个相互关联的模块(PM)文件(在这些PL和PM文件中使用) 我有一个Logger.PM,其中有一个方法initialLogger(),用于创建日志对象如何在Perl中跨模块使用Log4Perl?,perl,logging,log4perl,Perl,Logging,Log4perl,我计划在我的模块中使用Log4Perl进行日志记录 我的代码结构是这样的 我有Start.PL,它验证了一些参数。我有几个相互关联的模块(PM)文件(在这些PL和PM文件中使用) 我有一个Logger.PM,其中有一个方法initialLogger(),用于创建日志对象 $log = Log::Log4perl->get_logger("MyLog"); 我调用这个方法Logger::initialLogger() 以下是我的问题 如何跨模块(PM文件)使用相同的$log 我需要
$log = Log::Log4perl->get_logger("MyLog");
我调用这个方法Logger::initialLogger()
以下是我的问题
如何跨模块(PM文件)使用相同的$log
我需要使用相同的包名吗
如果有人能澄清我的这些观点,那就太好了。使用全局变量,比如
$main::log = Log::Log4perl->get_logger("MyLog");
因此,您可以在模块中的任何位置访问变量$main::log。因为它将在名称空间中维护。您可以使用我们的
将$log
声明为包变量,并在需要时使用实例的详细完全限定名:
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
可以在需要记录器的每个包中创建别名实际上,按照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,可以在每个模块中调用get_logger(“MyLog”)
但是,如果您希望能够在一个特定模块中打开或关闭日志记录,更好的方法可能是不带参数地调用get_logger()。这将返回一个绑定到当前包名称的记录器,因此您可以在配置文件中打开或关闭该包的记录器。您能解释更多信息吗?不知何故,我没有领会要点。对不起,它起作用了:-)我的错误。谢谢你花时间解释我不知道是singelton。谢谢你。我会检查你的建议。
Log::Log4perl::Logger=HASH(0x15a9d48)
Log::Log4perl::Logger=HASH(0x15a9d48)