2

perl で ETL プロセスをセットアップして、多数のファイルを処理し、それらをデータベースにロードします。

最近、パフォーマンス上の理由から、fork() 呼び出しと system("perl someOtherPerlProcess.pl $arg1 $arg2") への呼び出しを使用して、コードをマルチスレッドに設定しました。

最終的に、someOtherPerlProcess.pl の約 12 のインスタンスが異なる引数で実行され、これらのプロセスはそれぞれ、1 ディレクトリ分のファイル (データベース内の 1 つのテーブルに対応) を処理します。

アプリケーションの主な機能は動作しますが、ログの構成方法を理解するのに問題があります。

理想的には、すべての someOtherPerlProcess.pl が同じ $log_config 値を共有してロガーを初期化したいのですが、それぞれが作業中のディレクトリにログ ファイルを作成するようにします。

私はそれを行う方法を理解することができませんでした。また、これらの perl スクリプトを呼び出しているディレクトリに、すべてのログ メッセージを含むいくつかのファイル (ARRAY(0x260eec)、ARRAY(0x313f8) など) があることにも気付きました!

実行中のコードから log4perl.appender.A1.filename 値を変更する簡単な方法はありますか? または、使用するファイル名を動的に構成しますが、構成ファイルの他のすべての値を使用しますか?

4

2 に答える 2

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 に答える
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 に答える