本文以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。这是异步的操作。