如何在 Perl 中跨模块使用 Log4Perl?
我计划在我的模块中使用 Log4Perl 进行日志记录。
我的代码结构是这样的
我有 Start.PL 来验证一些参数。我有几个相互链接的模块(PM)文件(在这些 PL 和 PM 文件之间使用)
我有一个 Logger.PM,其中有一个方法 InitiateLogger() ,它创建日志对象,
$log = Log::Log4perl->get_logger("MyLog");
我将此方法称为 Logger:: Start.pl 中的 InitiateLogger();
这是我的问题
- 如何在模块(PM 文件)中使用相同的 $log
- 我是否需要为此使用相同的包名称?
如果有人向我澄清这些观点,那就太好了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
our
将$log
声明为包变量,并在任何需要的地方使用该实例,使用其详细的完全限定名称:您可以使用typeglob 赋值后的别名:
产生:
在您的情况下,Start.pl 中记录器对象的完全限定名称是
$main::log
。您可以使用
*log = $main::log
在需要记录器的每个包中创建别名。You may declare
$log
as a package variable withour
and use the instance wherever you need, using its verbose fully qualified name:In place of fully qualified name you can use an alias after a typeglob assignment:
which yields:
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
.实际上,Log4perl 的工作方式(它是单例), get_logger() 将在程序中的任何位置返回完全相同的对象,
此打印(例如):
因此,如果您想在所有模块中使用相同的 $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
This prints (for example):
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.
使用全局变量,例如,
这样您就可以在模块中的任何位置访问变量 $main::log 。因为它会在命名空间中维护。
Use global variables like,
So you can access the variable $main::log anywhere across the modules. Because it will be maintained in the namespace.