log4j2異步及總結

  • log4j可以配置輸出到不同的地方,比如console,file,sockete,mq等

  • 每一種都輸出都可以配置成異步的,包裹一下就可以了,具體看官網配置

  • 對於RollingFileAppender,默認bufferedIO 爲true,底層對應的使用BufferedOutputStream,bufferSize 爲8192bytes,這個也是BufferedOutputStream的默認配置。如果bufferedIO爲false,則使用的是不帶buffer的FileOutputStream

  • RollingFileAppender中的immediateFlush這個值默認是true,表示每次寫入後都會flush操作,這個可以確保日誌可以及時的寫入磁盤,但是效率較低。這個配置無論對於同步和異步都起作用。但是對於異步,應該把immediateFlush設爲false,這樣的話,Asynchronous loggers and appenders will automatically flush at the end of a batch of events ,意思即批量刷,從如下代碼也可以看出來

public void append(final LogEvent event) {
        readLock.lock();
        try {
            final byte[] bytes = getLayout().toByteArray(event);
            if (bytes.length > 0) {
                manager.write(bytes);
                if (this.immediateFlush || event.isEndOfBatch()) {
                    manager.flush();
                }
            }
        } catch (final AppenderLoggingException ex) {
            error("Unable to write to stream " + manager.getName() + " for appender " + getName());
            throw ex;
        } finally {
            readLock.unlock();
        }
    }
  • 應該優先使用RollingRandomAccessFileAppender 而不是RollingFileAppender,它是使用ByteBuffer + RandomAccessFile而不是BufferedOutputStream ,效率會提供20-200%,並且他總是buffered,因爲使用了NIO中的ByteBuffer

  • 異步的4種方式 Log4j2一共有4中異步模式,也可以說是三種,因爲有2種其實是一樣的,看如下表格 輸入圖片說明

  • 如上表格,第一個和第三個效果是一樣的,只不過用了第一個後,所有的都是異步的,而第三個,可以靈活配置同步和異步並存而已

  • 使用第四種,會額外起2個線程,一個處理Distruptor,另一個處理queue,Distruptor用來喚醒queue,實際的日誌對象還是通過queue來存和取

  • RingBuffer的默認大小是256*1024,可以通過log4j2.asyncLoggerConfigRingBufferSize 來調整,對於log2j2.3必須使用-DAsyncLoggerConfig.RingBufferSize來調整

  • queue(ArrayBlockingQueue)的大小默認爲128,可以通過AsyncAppender中的bufferSize來調整,如果使用LinkedTransferQueue,則忽略bufferSize參數,因爲它 是一個無界隊列,注意Log4j 2.7 及以上才支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章