Не могу создать базовый регистратор в Perl

Я читаю о 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()?


person Jim    schedule 26.05.2013    source источник
comment
(1) Я не очень хорошо разбираюсь в Log::Log4Perl, но, пожалуйста, удалите () из объявления test_log, если только вы точно не знаете, что такое прототипы подпрограмм (Вы не знаете; здесь говорится, что test_log не может принимать любые аргументы). (2) Часть статьи, содержащая приведенный выше код, говорит о наследовании конфигурации и предполагает, что класс Groceries полностью настроен для использования Log4Perl. Если вы закроете init здесь, вам не нужно повторять это в Groceries::Food. Кажется, вы не подготовили класс Groceries.   -  person amon    schedule 26.05.2013
comment
Информацию о том, как инициализировать, можно найти в FAQ -- Как проще всего использовать Log4perl?   -  person devnull    schedule 26.05.2013
comment
@toolic:Но разве init не требуется, когда мы предоставляем файл конфигурации Log::Log4perl->init("foo.conf");? Моя конфигурация находится в ######### System initialization section ### скрипта. Разве это не то же самое?   -  person Jim    schedule 26.05.2013
comment
@devnull:Пожалуйста, смотрите мой предыдущий комментарий   -  person Jim    schedule 26.05.2013


Ответы (2)


Вы не упомянули приложения:

my $food_logger = get_logger("Groceries::Food");
$food_logger->level($INFO);

# Appenders
my $appender = Log::Log4perl::Appender->new(
    "Log::Dispatch::File",
    filename => "test.log",
    mode     => "append",
);

$food_logger->add_appender($appender);
person Pradeep    schedule 25.06.2013

Добавление приложений, как указано выше, должно исправить ошибку.

Дополнительно:
Еще один способ просто избавиться от этого предупреждения — отключить сообщение "Log4perl: похоже, инициализации не произошло". Забыли вызвать init()?', добавив qw(get_logger :nowarn) в оператор использования Log4perl:

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

Вы также можете запустить проверку инициализации с помощью Log::Log4perl::initialized().
т.е.

print "Logger initialized\n" if ( Log::Log4perl::initialized() );

Более подробную информацию можно найти здесь (Часто задаваемые вопросы по Log4perl): http://rpm.pbone.net/index.php3/stat/45/idpl/25575098/numer/3/nazwa/Log::Log4perl::FAQ

Согласно этой документации, предупреждение появляется только один раз в качестве напоминания пользователям не забывать инициализировать систему ведения журнала перед ее использованием.

Тем не менее, первый ответ следует рекомендовать.

person lkisac    schedule 18.07.2014