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");
Или вы можете предоставить регистратор непосредственно в конструктор.