1

WinXP 上的 ActiveState Perl 5.12

我最近成为了 Log4perl 的转换者,并成功地使用了它,我为构成我的应用程序的每个模块定义了一个特定的记录器。例子:

上传.pm-----

my $logger = get_logger("Upload");  # specific logger
my $layout = Log::Log4perl::Layout::PatternLayout->new( "%d %p> %F{1}:%L %M - %m%n");
my $appender = Log::Log4perl::Appender->new( "Log::Dispatch::File",
                                     filename => "Upload.log",
                                     mode     => "append"
                    );
$appender->layout($layout);
$logger->level($OFF);    #  or $INFO
$logger->add_appender($appender)
....

这可行,但很难跨大量日志文件跟踪程序流,例如 Upload.log 、 Parse.log 、 FileRead.log 等。快速-n-dirty 解决方案:在所有记录器中使用相同的文件名。这效果要好得多,但前提是程序是按顺序连续使用的。

现在对于皱纹 - 假设模块 Upload.pm 被几个程序使用,即 readMyFiles.pl、readHerFiles.pl 和 dumpAllFiles.pl。运行 readMyFiles.pl 时,我希望 Upload.pm 中的记录器写入 readMyFiles.pl.log,运行时 dumpAllFiles.pl 希望 Upload.pm 中的记录器写入 dumpAllFiles.pl.log

一种方法可能是在我的 .pl 文件中声明我们的 变量 $logFileName 并在我的所有模块中使用它,如下所示:

                                      filename => $logFileName,

另一个可能是从我的 .pm 中删除所有记录器并仅在 .pl 中定义它们 - 但是我将如何在 .pm 中引用 $logger ?

感谢所有想法和建议。

仍在学习的史蒂夫

4

1 回答 1

2

在调用者中配置您的日志记录设置,而不是在模块中。如果其他人使用您的模块,他们可能不想将内容记录到您所做的同一个地方。他们可能还想以不同的方式格式化日志消息,或者使用不同类型的附加程序,或者……不胜枚举。

您的模块应该只获取一个记录器并向其写入消息:

我的模块.pm

#!/usr/bin/perl

package MyModule;

use strict;

use Log::Log4perl qw(get_logger);

sub foo {
    my $logger = get_logger("Foo");
    $logger->debug("Hello from MyModule");
}

1;

您的主程序应配置和初始化日志记录:

日志测试

#!/usr/bin/perl

use strict;
use warnings;

use Log::Log4perl qw(get_logger);
use MyModule;

Log::Log4perl->init("log4perl.cfg");

my $logger = get_logger("Foo");
$logger->debug("Hello from main");

MyModule::foo();

我更喜欢为 Log4perl 设置使用单独的配置文件:

log4perl.cfg

log4perl.logger.Foo=DEBUG, Screen

log4perl.appender.Screen=Log::Dispatch::Screen
log4perl.appender.Screen.Threshold=DEBUG
log4perl.appender.Screen.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.Screen.layout.ConversionPattern=[%r] %F %L %c - %m%n

输出:

[0] logtest 12 Foo - Hello from main
[0] MyModule.pm 11 Foo - Hello from MyModule

请注意,在尝试进入模块之前Log::Log4perl->init,您必须在调用者中初始化日志记录。如果不这样做,来自模块的日志消息将被忽略,您将收到以下警告:get_logger

Log4perl: Seems like no initialization happened.
Forgot to call init()?

有关详细信息,请参阅文档

于 2014-02-19T21:34:22.667 回答