关于Log4j的性能优化--FileAppender

本文以slf4j.1.7.19为源码展示样例。

项目中用的Appender是org.apache.log4j.RollingFileAppender

在配置文件中加以下两句可以减少磁盘IO操作

 

log4j.appender.all.bufferedIO=true
log4j.appender.all.bufferSize=81920

 

 

第一个表示IO使用缓冲区;

第二个参数表示缓冲区的大小,单位是B,字节;

 

相关源码如下:org.apache.log4j.FileAppender

 

public
  synchronized
  void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
                                                            throws IOException {
    LogLog.debug("setFile called: "+fileName+", "+append);

    // It does not make sense to have immediate flush and bufferedIO.
    if(bufferedIO) {
      setImmediateFlush(false);
    }

    reset();
    FileOutputStream ostream = null;
    try {
          //
          //   attempt to create file
          //
          ostream = new FileOutputStream(fileName, append);
    } catch(FileNotFoundException ex) {
          //
          //   if parent directory does not exist then
          //      attempt to create it and try to create file
          //      see bug 9150
          //
          String parentName = new File(fileName).getParent();
          if (parentName != null) {
             File parentDir = new File(parentName);
             if(!parentDir.exists() && parentDir.mkdirs()) {
                ostream = new FileOutputStream(fileName, append);
             } else {
                throw ex;
             }
          } else {
             throw ex;
          }
    }
    Writer fw = createWriter(ostream);
    if(bufferedIO) {
      fw = new BufferedWriter(fw, bufferSize);
    }
    this.setQWForFiles(fw);
    this.fileName = fileName;
    this.fileAppend = append;
    this.bufferedIO = bufferedIO;
    this.bufferSize = bufferSize;
    writeHeader();
    LogLog.debug("setFile ended");
  }

 

 

可见只有bufferedIO配置为true,才会使用缓冲区。

bufferedIO默认为false,相关源码如下:

 

/**
     Do we do bufferedIO? */
  protected boolean bufferedIO = false;

  /**
   * Determines the size of IO buffer be. Default is 8K. 
   */
  protected int bufferSize = 8*1024;

 

 

bufferSize默认为8K,如果够用的话,可以不配置,只配置bufferedIO为true,即可。

 

另外,如果IO确实是应用的瓶颈,可以考虑使用org.apache.log4j.AsyncAppender。这是异步的操作。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值