3
ログバック非同期ログは同期ログよりもパフォーマンスが劣ります。以下の詳細。logback:AsyncAppenderが同期FileAppenderよりも時間がかかります
どうすればよいですか?
テストクラス:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main extends Thread {
public static final Logger defaultLogger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws IOException {
new Main().start();
System.out.println("... Thread started\n");
// This is to block till thread finishes writing
System.in.read();
}
public void run() {
long start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
defaultLogger.warn("Default logger:");
}
long end = System.currentTimeMillis();
System.out.println("\n**** " + new Long(end - start));
}
}
logback.xml:
<configuration>
<appender name="DEFAULT-FILE" class="ch.qos.logback.core.FileAppender">
<append>true</append>
<file>logger.log</file>
<encoder charset="UTF-8">
<pattern>[%date] [%thread] %msg %n</pattern>
</encoder>
</appender>
<appender name="DEFAULT-ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- Have tried to play around with queue size - no major effect -->
<!-- <queueSize>512</queueSize> -->
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="DEFAULT-FILE" />
</appender>
<root level="all">
<!-- Switch between the two appenders -->
<appender-ref ref="DEFAULT-FILE" />
<!-- <appender-ref ref="DEFAULT-ASYNC" /> -->
</root>
</configuration>
観察:
同期FileAppender:〜5000ms AsyncAppender:〜7000ms
バージョン:
SLF4J:1.7.19 logback:あなたのコードの1.1.6
キューサイズを1000000にしましたか?それ以外の場合は、測定コードがキューのサイズを強制的に変更し、悪いタイミングの主な問題である可能性があります...さらに、同じJVMインスタンスで複数の測定を行い、クラスとバッファの初期化時間のために汚染される可能性があるため、 – Robert
あなたは絶対に正しいです。キューのサイズは十分に大きくする必要があります。そうでないと、キューがいっぱいになり、ワーカーによってクリアされているときにロギングがブロックされます(キューのサイズ変更はありません。ブロックのためにロギングが遅くなります) //logback.qos.ch/manual/appenders.html) 'デフォルトでは、イベントキューは最大256個のイベントが設定されています。キューがいっぱいになると、ワーカースレッドが1つまたは複数のイベントをディスパッチするまで、アプリケーションスレッドは新しいイベントを記録することができなくなります。 ' – gammay
@Robertこれを回答として追加できれば、私はそれを受け入れるでしょう – gammay