私はlog4j 2.5を使用するアプリを書いています。パフォーマンスを向上させるために、私はロガーを非同期にしたいと思っていましたが、ディスアセンサーの依存関係を追加したくないので、非同期アペンダーを使用することに決めました。私はそれらを使用する方法のいくつかの例を見つけましたが、私は何か問題がプロセスで間違っていたと思います:(log4j AsyncAppenderを使用しているときに重複するメッセージ
私はXML設定ファイルを使用していませんが、代わりにコード内のすべてのロガーを作成します。
アペンダーごとに重複したメッセージが表示されるのは、アペンダー自体とAsyncAppenderがメッセージを送信しているためです。そのアペンダへ
マイコード:?
addAppenderToLogger(fileAppender, logger)
addAppenderToLogger(rollingFileAppender, logger)
AsyncAppender.createAppender(
names.map(name => AppenderRef.createAppenderRef(
name, Level.getLevel("INFO"), null
)), errorRef, true, 0, 2048, s"async-appender", false, null, config, true
)
私は両方のアペンダーに1つのAsyncAppenderを作成しています。重複したログの
例:
2017年1月26日13:21:33619 [キュータタスクの起動ワーカー-1] INFO ショートテキスト - ID 973376
2017-をタグ付けするために開始01-26 13:21:33,619 [Executor task launch worker-2] INFO 短いテキスト - タグ付けを開始するID 2497995
2017-01-26 13:21:33,619 [Executor task launch worker-1] INFO 短いテキスト - タグID 973376の開始
2017年1月26日13:21:33619 [キュータタスクの起動ワーカー-2] INFO ショートテキスト - あなたにFileAppenderとAsyncAppenderの両方を追加した場合はID 2497995
私が前にしたことは、アペンダーを作成してロガーに追加した後、「AppenderRefs」を使用して非同期アペンダーを作成して元のアペンダーを削除することでした。それは動作するように見えましたが、それはかなり醜い解決策です(作成してから削除する)。私は今あなたがしたことを試みたが、私はNullPointerExceptionを取得する。アペンダーを作成する場所はどこですか?メインのロガーで?私のアプリケーションのコンテキストロガーで作成したAsyncAppender?変数として作成するだけでは不十分です(NullPointerExceptionを作成する) – sid802
ルートロガーはAsyncAppenderを参照する必要があり、AsyncAppenderはFileAppenderを参照する必要があります。同じLoggerContextから取得した他のロガー(アプリケーションの場合は〜1)は、イベントを親ロガー(ルートロガー)にルーティングします。 –
しかし、AsyncAppenderがLogger /コンテキストに登録されていない場合、FileAppenderを参照するにはどうすればよいですか? 例えば: ヴァルfileAppender = createFileAppender(名) ヴァルrollingFileAppender = createRollingFileAppender(名前、folderNameExt) ヴァルcurLogger = ctx.getLogger(名) addAppenderToLogger(createAsyncAdapter(配列(fileAppender.getName、rollingFileAppender.getName) 、fileAppender.getName)、curLogger) ctx.getLogger(名).setLevel(Level.ALL)ので、実行時にNullPointerExceptionが発生 結果は、createAsyncAdapterはアペンダの名前の例と – sid802