2012-02-13 20 views
2

私はperlスクリプトにlogging vai Log :: Log4perlを使用しています。同じログオブジェクトに複数の呼び出しを行って誤った/誤った動作をさせるのではないかと思います。perl:Log Log4perlはマルチスレッド環境で動作しますか?

私はアペンダを使用しています::ファイルを次のようにログを書き出すために

$log->info("Launching commands..."); 
foreach my $param (@params) { 
    push @thread_handles, async { 
     system("$param"); 
     $log->info("$param COMPLETE"); 
     logstatus($?); 
    }; 
} 

$_->join() foreach @thread_handles; 
$log->info("Commands completed..."); 
+1

ロギングを気にしないで、 '$? 'を正しく使うことができますか? :-) –

+0

スレッド化されたenvでシステムコードが返されたことを確認するにはどうすればよいですか? – Blaskovicz

答えて

2

ログイン:: Log4perlがdefault file based appenderで動作しますが、一部の重なりがマルチに発生する可能性があります同じログファイルを使用して、マルチスレッド環境またはマルチプロセス環境に移行します。

1つの解決策は、アペンダーとしてLog::Log4perl::Appender::Synchronizedを使用することです。詳細についてはFAQのHow can I run Log::Log4perl under mod_perl?を参照してください。

0

Log4perlはスレッド環境で動作していますが、アペンダーを慎重に選択する必要があります。

同期されたアペンダを除いて、バッファリングされたログメッセージは順番に表示されませんが、これは問題ではありません。

スレッドごとに異なるファイルを使用するか、ログメッセージにpidを追加します。

同期されたアペンダーは、スレッドアプリケーションでオーバーヘッドの原因となる可能性があります。慎重に使用してください。

私は、pidや何らかの種類のスレッド識別子を持つ単一のログファイルを選択します。この種のログは問題なく使用しています。同期アペンダを使用して

に関して、

1

は多くの意味になります。 私の質問は次のとおりです: ロガー変数はスレッドに渡されますか? perlthrtutによるとそれはしません。私はこれをまだ検証していない。誰かがすでにそれをしていないかぎり?

threads::sharedを使用してロガー変数を共有しようとするかもしれませんが、threads::shared documentationは、スカラー、配列、またはハッシュのみを共有できることを指定しています。とにかくperl 5.8.8で試してみましたが、期待通りに動作しません。

もう1つの方法は、スレッドで呼び出されるサブルーチンごとに別々のロガーを作成することです。 log4perlアペンダーは、ロックとインターリーブを避けるように構成できます。しかし、私は真のスレッドごとに別々のロガーインスタンスを生成することに伴うパフォーマンスの影響について真剣に心配しています。

更新日: 複雑になる必要はありません。単一のスレッド・スクリプトを作成していて、特別なトリックなしにロガー・オブジェクト・メソッドを呼び出すようにlog4perlを初期化すると、すべてが宣言されたとおりに機能します。ロガーオブジェクトはスレッドエントリポイントに渡す必要はありません。スレッドエントリポイントで呼び出されたsubは、通常の方法で呼び出されたのと同じ方法でロガーメソッドにアクセスします。同期化されたアペンダーは、すべての行を維持します。

関連する問題