我打算在我的模块中使用Log4Perl进行日志记录。
我的代码结构就像这样
我有Start.PL验证一些参数。我有几个相互链接的模块(PM)文件(用于这些PL和PM文件)
我有一个Logger.PM,其中我有一个创建日志对象的方法InitiateLogger()
$log = Log::Log4perl->get_logger("MyLog");
我在Start.pl
中调用此方法Logger::InitiateLogger();
以下是我的问题
如果有人向我澄清这些要点,那就太好了。
答案 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。因为它将在命名空间中维护。