Я читаю о Log4Perl
с сайта perl.com
Я пытаюсь следовать руководству, но "заблудился" в части Logger Categories
.
Я попытался следовать руководству и выполнил следующие сценарии:
Я создал каталог Groceries
и внутри него создал файл pm
следующим образом:
Food.pm:
#!/usr/bin/perl
use strict;
use warnings;
package Groceries::Food;
use Log::Log4perl qw(get_logger);
sub new {
my($class, $what) = @_;
my $logger = get_logger("Groceries::Food");
if(defined $what) {
$logger->debug("New food: $what");
return bless { what => $what }, $class;
}
$logger->error("No food defined");
return undef;
}
sub consume {
my($self) = @_;
my $logger = get_logger("Groceries::Food");
$logger->info("Eating $self->{what}");
}
Это копирование/вставка с perl.com, упомянутого выше.
Затем в том же каталоге, в котором находится Groceries
каталогов (т. е. не в том же каталоге, где находится Food.pm
), я создал еще один скрипт следующим образом:
test_script.pl:
#!/usr/bin/perl
use strict;
use warnings;
######### System initialization section ###
use Log::Log4perl qw(get_logger :levels);
my $food_logger = get_logger("Groceries");
$food_logger->level($INFO);
sub test_log(){
my $what = @_;
if(defined $what){
$food_logger->info("Defined:", $what);
}
else{
$food_logger->error("Nothing defined");
}
}
test_log();
Но когда я запускаю тестовый скрипт, он не работает. Я получил:
Log4perl: Seems like no initialization happened. Forgot to call init()?
Также, если я добавлю:test_log("something");
Я получил:
Too many arguments for main::test_log at testlogger.pl line 23, near ""something")"
Execution of testlogger.pl aborted due to compilation errors.
Что я здесь делаю неправильно?
ОБНОВЛЕНИЕ
Я следовал инструкциям и изменил то, что написано на listing 2: eat.pl
.
#!/usr/bin/perl
use strict;
use warnings;
use Log::Log4perl qw(get_logger :levels);
######### System initialization section ###
my $food_logger = get_logger("Groceries::Food");
$food_logger->level($INFO);
#############Run it ###
my $o = Groceries::Food->new("Chicken");
$o->consume();
####Application section ####
package Groceries::Food;
use Log::Log4perl qw(get_logger);
sub new {
my($class, $what) = @_;
my $logger = $food_logger;#get_logger("Groceries::Food");
if(defined $what) {
$logger->debug("New food: $what");
return bless { what => $what }, $class;
}
$logger->error("No food defined");
return undef;
}
sub consume {
my($self) = @_;
my $logger = $food_logger;#get_logger("Groceries::Food");
$logger->info("Eating $self->{what}");
}
Я все еще получаю Log4perl: Seems like no initialization happened. Forgot to call init()?
Log::Log4Perl
, но, пожалуйста, удалите()
из объявленияtest_log
, если только вы точно не знаете, что такое прототипы подпрограмм (Вы не знаете; здесь говорится, чтоtest_log
не может принимать любые аргументы). (2) Часть статьи, содержащая приведенный выше код, говорит о наследовании конфигурации и предполагает, что классGroceries
полностью настроен для использования Log4Perl. Если вы закроетеinit
здесь, вам не нужно повторять это вGroceries::Food
. Кажется, вы не подготовили классGroceries
. - person amon   schedule 26.05.2013init
не требуется, когда мы предоставляем файл конфигурацииLog::Log4perl->init("foo.conf");
? Моя конфигурация находится в######### System initialization section ###
скрипта. Разве это не то же самое? - person Jim   schedule 26.05.2013