Как я могу использовать Log4Perl через модули в Perl? - PullRequest
4 голосов
/ 27 сентября 2011

Я планирую использовать Log4Perl в своих модулях для регистрации.

Моя структура кода выглядит следующим образом

У меня есть Start.PL, который проверяет некоторые параметры. У меня есть несколько файлов (PM), которые связаны между собой (используются в этих файлах PL и PM)

У меня есть Logger.PM, в котором у меня есть метод InitiateLogger (), который создает объект журнала

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

Я называю этот метод Logger::InitiateLogger(); в Start.pl

Вот мои вопросы

  1. Как я могу использовать один и тот же журнал $ для всех модулей (файлы PM)
  2. Нужно ли использовать для этого одно и то же имя пакета?

Было бы неплохо, если бы кто-то разъяснил мне эти моменты.

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

Вы можете объявить $log как переменную пакета с our и использовать экземпляр везде, где вам нужно, используя его подробное полное имя:

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.

4 голосов
/ 28 сентября 2011

На самом деле, как работает 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)

Так что, если вы хотите использовать один и тот же журнал $ во всех ваших модулях, вы можете просто вызвать get_logger ("MyLog") в каждом из этих модулей.

Но лучший способ, если вы хотите иметь возможность включать или выключать вход в систему в одном конкретном модуле, это просто вызвать get_logger () без аргументов. Это вернет вам регистратор, привязанный к имени текущего пакета, так что вы можете включить или отключить регистратор этого пакета в своем конфигурационном файле.

0 голосов
/ 27 сентября 2011

Используйте глобальные переменные, такие как,

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

Так что вы можете получить доступ к переменной $ main :: log в любом месте через модули.Потому что оно будет поддерживаться в пространстве имен.

...