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

标签 perl logging log4perl

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

我的代码结构是这样的

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

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

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

我把这个方法称为 Logger::InitiateLogger();在 Start.pl

这是我的问题
  • 如何跨模块使用相同的 $log(PM 文件)
  • 我需要为此使用相同的包名吗?

  • 如果有人澄清我这些观点会很好。

    最佳答案

    您可以声明$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 中记录器对象的完全限定名称是 $main::log .
    您可以使用 *log = $main::log 在每个需要记录器的包中创建一个别名。 .

    关于perl - 如何在 Perl 中跨模块使用 Log4Perl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7568730/

    相关文章:

    perl - 将我的散列应用于字符串以从字母中获取数字

    .net - .NET 中是否有类似 perl 的 Regexp::Grammars 或标记的子模式?

    perl - 如何在 Log4perl 中抑制输出到 stdout 和 stderr?

    perl - 请向我解释 map 在这种情况下是如何工作的

    perl - 为 perl 配置包路径的正确方法是什么?

    java - Eclipse-Tomcat 设置中的错误 - ClassNotFoundException "1catalina.org.apache.juli.FileHandler"

    关于文本日志文件的 C# 最佳实践

    ruby-on-rails - 将调用者应用程序堆栈跟踪与每个 sql 查询一起记录

    perl - 使用 log4perl 限制日志大小

    perl - 如何在运行时更改 log4perl 附加程序的过滤器?