2017-01-29 19 views
1

私は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

答えて

1

をタグ付けするために開始これがボトルネックになり、非同期ロギングの利点が失われます。

に追加してください。AsyncAppenderをロガーに追加し、AsyncAppenderがAppenderRefを介してFileAppenderをポイントするようにしてください。


プログラム設定の場合、Log4j2テストの中には、実行しようとしているものに似たものがあります。例えば、this one

final LoggerContext context = LoggerContext.getContext(false); 
final Configuration config = context.getConfiguration(); 
final PatternLayout layout = PatternLayout.createDefaultLayout(config); 
final Appender appender = WriterAppender.createAppender(layout, null, writer, writerName, false, true); 
appender.start(); 
config.addAppender(appender); 

final Level level = null; 
final Filter filter = null; 
for (final LoggerConfig loggerConfig : config.getLoggers().values()) { 
    loggerConfig.addAppender(appender, level, filter); 
} 
config.getRootLogger().addAppender(appender, level, filter); 

私はこれが役立つことを望みます。

+0

私が前にしたことは、アペンダーを作成してロガーに追加した後、「AppenderRefs」を使用して非同期アペンダーを作成して元のアペンダーを削除することでした。それは動作するように見えましたが、それはかなり醜い解決策です(作成してから削除する)。私は今あなたがしたことを試みたが、私はNullPointerExceptionを取得する。アペンダーを作成する場所はどこですか?メインのロガーで?私のアプリケーションのコンテキストロガーで作成したAsyncAppender?変数として作成するだけでは不十分です(NullPointerExceptionを作成する) – sid802

+0

ルートロガーはAsyncAppenderを参照する必要があり、AsyncAppenderはFileAppenderを参照する必要があります。同じLoggerContextから取得した他のロガー(アプリケーションの場合は〜1)は、イベントを親ロガー(ルートロガー)にルーティングします。 –

+0

しかし、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

関連する問題