您的位置:首页 > 其它

log4j2异步及总结

2018-05-16 11:40 253 查看
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 及以上才支持
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  log4j2