Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中跨模块使用Log4Perl?_Perl_Logging_Log4perl - Fatal编程技术网

如何在Perl中跨模块使用Log4Perl?

如何在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 我需要

我计划在我的模块中使用Log4Perl进行日志记录

我的代码结构是这样的

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

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

 $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)