2016-07-31 31 views
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

+0

キューサイズを1000000にしましたか?それ以外の場合は、測定コードがキューのサイズを強制的に変更し、悪いタイミングの主な問題である可能性があります...さらに、同じJVMインスタンスで複数の測定を行い、クラスとバッファの初期化時間のために汚染される可能性があるため、 – Robert

+0

あなたは絶対に正しいです。キューのサイズは十分に大きくする必要があります。そうでないと、キューがいっぱいになり、ワーカーによってクリアされているときにロギングがブロックされます(キューのサイズ変更はありません。ブロックのためにロギングが遅くなります) //logback.qos.ch/manual/appenders.html) 'デフォルトでは、イベントキューは最大256個のイベントが設定されています。キューがいっぱいになると、ワーカースレッドが1つまたは複数のイベントをディスパッチするまで、アプリケーションスレッドは新しいイベントを記録することができなくなります。 ' – gammay

+0

@Robertこれを回答として追加できれば、私はそれを受け入れるでしょう – gammay

答えて

5

一つの問題は、あなたが1000000ログを作成しているということですただし、AsyncAppenderには最大容量が256(デフォルト)のキューがあります。

したがって、最初の手順として、キューのサイズを1000000に増やす必要があります。それ以外の場合は、測定時間が無効です。

さらに、同じJVMインスタンスで複数の測定を行い、クラスとバッファの初期化時間のために汚染されている可能性があるため、最初のものを破棄する必要があります。

関連する問題