2

我在 perl 中设置了一个 ETL 进程来处理许多文件,并将它们加载到数据库中。

最近,出于性能原因,我通过使用 fork() 调用和对 system("perl someOtherPerlProcess.pl $arg1 $arg2") 的调用将代码设置为多线程。

我最终得到了大约 12 个使用不同参数运行的 someOtherPerlProcess.pl 实例,这些进程每个都通过一个包含文件的目录(对应于我们数据库中的一个表)工作。

应用程序的主要功能可以工作,但我在弄清楚如何配置我的日志记录时遇到了问题。

理想情况下,我希望所有 someOtherPerlProcess.pl 共享相同的 $log_config 值来初始化他们的记录器,但让每个人在他们正在处理的目录中创建一个日志文件。

我一直无法弄清楚如何做到这一点。我还注意到,在我调用这些 perl 脚本的目录中,我看到了几个包含我所有日志消息的文件(ARRAY(0x260eec)、ARRAY(0x313f8) 等)!

有没有一种简单的方法可以从运行代码中更改 log4perl.appender.A1.filename 值?或者以其他方式动态配置我们使用的文件名,但使用配置文件中的所有其他值?

4

2 回答 2

2

我为此想出了一个不太理想的解决方案,即直接从 someOtherPerlProcess.pl 配置我的记录器。

my $FORKED_LOG_CONF = "log4perl.appender.A1.filename=$directory_to_load/log.txt
log4perl.rootLogger=WARN, A1
log4perl.appender.A1=Log::Log4perl::Appender::File
log4perl.appender.A1.mode=append
log4perl.appender.A1.autoflush=1
log4perl.appender.A1.layout=PatternLayout
log4perl.appender.A1.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss}: %m%n";

#Logger start up
Log::Log4perl::init( \$FORKED_LOG_CONF);
my $logger = get_logger();

$directory_to_load 是记录器的进程特定部分,它在运行的 perl 进程的上下文中工作,并且该变量具有(本地)值,但如果在外部配置文件中使用该方法将失败。

我很高兴听到任何替代解决方案。

于 2012-08-03T20:43:58.717 回答
2

在您的配置文件中:

log4perl.appender.A1.filename=__LOGFILE__

在您的脚本中:

use File::Slurp;
my $log_cfg = read_file( $log_cfgfile );
my $logfile = "$directory_to_load/log.txt";
$log_cfg =~ s/__LOGFILE__/$logfile/;
Log::Log4perl::init( \$log_cfg );
于 2013-04-30T05:25:49.007 回答