-
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 及以上才支持