我有一个脚本“server.pl”,它在后台运行,使用Log4Perl进行自我记录。
此脚本不断读入目录并使用Linux :: Inotify2模块检测在其中创建的新文件。
每个检测到的文件都是一个Storable对象,它是一个要运行的管道,必须在自己的日志文件中写入。我的问题是当我调用Log4Perl :: init初始化管道的记录器时,server.pl不再记录自己,因为新的初始化已经覆盖了前一个。所以问题是如何让'server.pl'脚本保持Log4Perl的多个实例(提前未定义的数字)?
下面是'server.pl'的截断版本(没有无聊的东西)
#!/usr/bin/perl
use warnings;
use strict;
use Carp;
use Log::Log4perl;
use Linux::Inotify2;
use Storable;
Log::Log4perl->init('/.../log4perl.conf');
my $server_logger = Log::Log4perl->get_logger("server");
my $tracker = PipelineBatchTracker->new( _logger => $server_logger);
my $inotify = new Linux::Inotify2()
or $server_logger->logcroak("Unable to create new inotify object: $!");
# Sets non-blocking inotify
$inotify->blocking(0);
# define watcher
$inotify->watch
(
"/.../serial/",
IN_CREATE,
sub {
my $e = shift;
my $pipe;
my $serial = $e->{name};
my $full = $e->{w}{name} . ${serial};
$server_logger->info(${serial} . " was created in " . $e->{w}{name}) if $e->IN_CREATE;
eval {
my $pipe = retrieve("${full}");
$server_logger->logcroak("Unable to retrieve storable object") unless defined $pipe;
$server_logger->info(${serial} . " loaded into a Synegie::Pipeline object");
# This methods call Log::Log4perl->init
# and this is bad cause the server and former
# running pipelines are not logging anymore !!!
$pipe->setLogger();
$tracker->addPipeline($pipe);
};
if ($@) {
$server_logger->error("server : Failed to add pipeline : $@");
}
}
);
while (1) {
$server_logger->trace("--------------------- AND AGAIN -------------------------");
$inotify->poll;
sleep 2;
eval {
$tracker->poke();
};
if ($@) {
$server_logger->error("server : $@");
}
sleep 30;
}
编辑:在全球范围内,这意味着我需要一个记录器,具体取决于每个实例,而不是仅在脚本级别定义的记录器。有任何想法吗 ? 感谢
答案 0 :(得分:1)
我不会说'不'但是因为Log4perl服从单身模式并不是一个好主意逆潮流!
如果你真的对它感兴趣,你可能(或可能不会)获取线程及其非共享数据的一些优点,但是创建和销毁perl线程会一点一点地增加使用内存量而无法返回,这是长期生活应用的问题!