log4j2异步及总结

原创
2018/05/16 11:40
阅读数 2K
  • 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 及以上才支持

展开阅读全文
打赏
0
0 收藏
分享
加载中
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部