Perl: передать (Log4perl-) объект в модуль

Я оценил Log4perl и хотел бы использовать его в основном Perl-скрипте и (нескольких) модулях. Как мне это реализовать, желательно в ОО-стиле? Можно ли соединить объект logger (основного сценария) с объектом модуля, чтобы полностью регистрировать события, которые происходят в основном сценарии, а также события модуля (объекта)?

Скажем, у меня есть что-то вроде этого основного сценария:

use rotate_action;
use Log::Log4perl;
my $logger = get_logger();
my $appender_log = Log::Log4perl::Appender->new(
    "Log::Dispatch::File",
    filename => "action.log",
    mode     => "append"
);
$logger->add_appender($appender_log);
$logger->info("Logger activated");

use rotate_action;
my $ro = Rotation->new; # package in rotate_action.pm
#associate logger-object with ro-object here:
$ro->$logger; # pseudo-code!

my $file "somefile";
$logger->info("processing $file");
$ro->process_file("$file");
$logger->info("finished processing $file);

И модуль rotate_action как это:

{
    package Rotation;

    sub new {
        my $class = shift;
        my $self = {};
        bless $self, $class;
        return $self;
    }

    sub process_file {
        my $self = shift;
        my $file = shift;

        my $exec_string = "identify -format \"orientation: %[orientation]\ngeometry: %g\n\"";
        $exec_string .= " $file";
        my $exec_result = `$exec_string 2>&1`;
        my $err_lvl = $?;
        if ($err_lvl != 0) {
            #put same logger-object from main script here:
            $self->$logger->warn("$file is not an image");  # pseudo-code!
        } else {
            #put same logger-object from main script here:
            $self->$logger->info("rotate $file");  # pseudo-code!
            `rotate.sh $file`;
        }
    }
}

Как передать объект logger в модуль для записи в тот же файл журнала (как настроено в main-script)?

1 ответ

Решение

Вы можете добавить поле логгера к объекту и сохранить его там:

sub add_logger {
    my ($self, $logger) = @_;
    $self->{logger} = $logger;
}

Который будет называться как

$ro->add_logger($logger);

И вы можете тогда

$self->{logger}->warn("$file is not an image");

Или вы можете предоставить регистратор непосредственно в конструктор.

Другие вопросы по тегам