【问题标题】:How can I use Log4Perl across modules in Perl?如何在 Perl 中跨模块使用 Log4Perl?
【发布时间】:2011-09-27 11:59:01
【问题描述】:

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

我的代码结构是这样的

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

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

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

我在 Start.pl 中调用这个方法Logger::InitiateLogger();

这是我的问题

  1. 如何跨模块使用相同的 $log(PM 文件)
  2. 我需要为此使用相同的包名吗?

如果有人能澄清我这些观点,那就太好了。

【问题讨论】:

    标签: perl logging log4perl


    【解决方案1】:

    您可以使用 our$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 在需要记录器的每个包中创建别名。

    【讨论】:

    • 对不起,它有效 :-) 我的错误。感谢您花时间解释
    【解决方案2】:

    实际上,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()。这将为您返回一个与当前包名称相关的记录器,因此您可以在配置文件中打开或关闭该包的记录器。

    【讨论】:

    • 从来不知道是单曲。谢谢你。将检查您的建议。
    【解决方案3】:

    使用全局变量,例如,

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

    因此,您可以跨模块访问变量 $main::log。因为它会在命名空间中维护。

    【讨论】:

    • 你能解释一下吗?不知怎的,我不明白这一点
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多