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

发布于 2024-12-06 21:08:47 字数 423 浏览 1 评论 0 原文

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

我的代码结构是这样的

我有 Start.PL 来验证一些参数。我有几个相互链接的模块(PM)文件(在这些 PL 和 PM 文件之间使用)

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

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

我将此方法称为 Logger:: Start.pl 中的 InitiateLogger();

这是我的问题

  1. 如何在模块(PM 文件)中使用相同的 $log
  2. 我是否需要为此使用相同的包名称?

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

I'm planning to use Log4Perl in my modules for logging.

My code structure goes like this

I have Start.PL which validates some parameters. I have several modules (PM) file which are interlinked (used across these PL and PM files)

I have a Logger.PM in which I have a method InitiateLogger() which creates the log object

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

I call this method Logger::InitiateLogger(); in the Start.pl

Here are my questions

  1. How can I use the same $log across the modules (PM files)
  2. Do I need to use same package name for this?

Would be nice if someone clarifies me these points.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼角的笑意。 2024-12-13 21:08:47

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

You may declare $log as a package variable with our and use the instance wherever you need, using its verbose fully qualified name:

Package::Name::$log->info( 'test' );

In place of fully qualified name you can use an alias after a typeglob assignment:

#!/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;

which yields:

Log::Log4perl::Logger=HASH(0x230ff20)

In your case, the fully qualified name of logger object in Start.pl is $main::log.
You can make an alias in every package where the logger is needed with *log = $main::log.

忆沫 2024-12-13 21:08:47

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

Actually, the way Log4perl works (it's a singleton), get_logger() will return the exact same object wherever in your program it's called from

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";

This prints (for example):

Log::Log4perl::Logger=HASH(0x15a9d48)
Log::Log4perl::Logger=HASH(0x15a9d48)

So if you want to use the same $log across all your modules, you could just call get_logger("MyLog") in each of those modules.

But a better way, if you want to be able to turn logging on or off in one particular module, might be to just call get_logger() without arguments. That will return you a logger tied to the current package name, so you could turn that package's logger on or off in your config file.

近箐 2024-12-13 21:08:47

使用全局变量,例如,

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

这样您就可以在模块中的任何位置访问变量 $main::log 。因为它会在命名空间中维护。

Use global variables like,

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

So you can access the variable $main::log anywhere across the modules. Because it will be maintained in the namespace.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文