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 ,意思即批量刷,从如下代码也可以看出来
应该优先使用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 及以上才支持
每一种都输出都可以配置成异步的,包裹一下就可以了,具体看官网配置
对于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 及以上才支持
相关文章推荐
- 2016年终总结
- ROS Launch使用总结
- 柳汽项目 心得总结整理
- 常见【十种】WEB攻击及防御技术总结
- 学号:201621123032 《Java程序设计》第14周学习总结
- Java面试七]Mybatis总结以及在面试中的一些问题
- IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结(转)
- Javadoc转换chm帮助文档的四种方法总结
- iOS 10 消息推送(UserNotifications)秘籍总结(一)
- ROS探索总结(三)——ROS新手教程【转】
- JQuery获取元素的方法总结
- JavaScript中创建原子的方法总结
- java的常见异常与错误总结
- 两大报表工具缺陷总结
- Flash图表AnyChart应用教程总结
- Hadoop学习总结之四:Map-Reduce的过程解析
- maya开洞的几种方法总结之三
- jQuery操作元素方法总结
- 利用easyBCD安装ubuntu双系统常见错误总结
- 分页技术总结