2015-10-23 7 views
11

私はEclipse RCPアプリケーションを開発しており、アプリケーション内でlog4j2を動作させるためにいくつかの苦労をしました。すべてが今はうまくいくように見えます。仕上げのタッチとして、私はall loggers asynchronouslyを作りたがっています。log4j2がLMAX disruptorを介して非同期でログを記録していることを確認する方法は?

私はクラスパスでLMAX Disruptorを手に入れました。私はissuesun.miscとしても解決したと思います。実行コンフィギュレーションでVM引数-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelectorを設定し、log4j2.xmlファイルも正しく設定してください。 私はだと思います。それが問題の原因です。私のアプリケーションが非同期的に適切な方法でログに記録されることを確認できるようにしたいので、私は潜在的な利点を楽しむことができます。

どうすれば私のロガーが非同期で動作していることを確認できますか?そのプロセスでLMAX Dirsuptorを利用できますか?

+0

ログ出力を取得していますか? –

+0

です。私はそれがそれを非同期的にすべきである方法で上陸させたかどうか分からないだけです。そして、私はEclipse/OSGiの黒い魔法のために盲目的な信頼を得ています。 –

+0

ところで、あなたのEclipseプラグインに 'sun.misc'を提供する問題を解決した場合は、リンクした質問に答えてもらえますか? –

答えて

9

異なるクラスによって処理される非同期ロガーには2種類あります。

  1. すべてのロガー非同期:AsyncLoggerクラス - あなたは非同期ロガーとAsyncLoggerContextSelector
  2. ミキシング同期を使用するときにアクティブ:AsyncLoggerConfigクラス - 設定ファイルが<Loggers>するための構成で入れ子になった<AsyncRoot>または<AsyncLogger>の要素を持っています。

あなたのすべてのロガーを非同期にしているので、ブレークポイントをAsyncLogger#logMessage(String, Level, Marker, Message, Throwable)に入れたいとします。

もう1つの方法は、設定ファイルの先頭に<Configuration status="trace">を設定することです。 log4jの内部log4jログメッセージが出力されます。 「AsyncLogger disruptorを起動しています...」のようなものが表示されます。これを見ると、すべてのロガーが非同期です。

+0

設定 ''はトリックをしました、ありがとう! [the docs](http://logging.apache.org/log4j/2.x/manual/configuration.html#StatusMessages)をもっと慎重に読んでください。設定ステータスを設定した後、 '2015-10-27 10:13:21,847 DEBUG Ringbufferサイズ262144の' AsyncLogger disruptorを起動します。 'すばらしいです! –

+0

重要:この回答は部分的に正しいようです。ブレークポイントメソッドは機能しますが、 ''メソッドは動作しません。後者を使うと、 'AsyncLogger disruptor ... Starting 'は、' -DLog4jContextSelector = org.apache.logging.log4j.core.async.AsyncLoggerContextSelector'フラグを指定するときと、そうでないときの両方でログに記録されます。ブレークポイントを使用すると、あるケース(フラグ付き)では、非同期ロガーが実際にヒットし、もう一方ではそうではないことがわかります。 –

+0

@JanŻankowskiJRE 8u102でDisruptor 3.3.5を使用してLog4j 2.5を実行すると、全く異なる結果が表示されます。私はそれらの中に "disruptor"という単語を含むログステートメントは見ません。しかし、すべてのロガーを非同期で実行するように設定すると、「AsyncLogger」と「AsyncContext」のテキストを含む一連のログ文が表示されます。さらに、ディスラプターライブラリーを除去すると、すべてのロガーを非同期で実行しようとするとアプリケーションがクラッシュします。 –

3

org.apache.logging.log4j.core.async.AsyncLoggerConfig#callAppendersにブレークポイントを設定します。その後、イベントが混乱しているのを見ることができます。同様に、org.apache.logging.log4j.core.config.LoggerConfig#callAppendersは、非同期ロギングのために混乱の反対側からヒットしたり、同期ログにヒットしたりする必要があります。

+0

私はlog4j2.xmlで設定してもブレークポイントが呼び出されますか? Eclipseでソースを添付してブレークポイントを設定しましたが、実行は停止しません。 –

+0

私は信じてはいけません。 'org.apache.logging.log4j.core.config.LoggerConfig#callAppenders'に別のブレークポイントを設定してください。これは邪魔者の「反対側」でヒットするだけです。あなたのロガーから直接ヒットした場合、それは動作しませんでした。 – mvd

+1

これはほぼ正しいが、それほど正確ではない。 AsyncLoggerConfigクラスは、すべてのロガーが非同期(AsyncLoggerContextSelectorが設定されている場合)では使用されません。詳細は私の答えを見てください。 –

関連する問題