log4j.properties
log4j.rootLogger=debug,myFileAppender
##自定义的appender
log4j.appender.myFileAppender=myappender.MWLogFileAppender
log4j.appender.myFileAppender.Encoding=utf-8
log4j.appender.myFileAppender.File=c:\\w\\wang-%s_%s_0.%s.log
log4j.appender.myFileAppender.layout=org.apache.log4j.PatternLayout
#每分钟产生一个日志 '.'yyyy-MM-dd-HH-mm'.log'中可以有空格,相应的结果是日志文件名中也有相应的空格,控制之前生成的日志的文件名显示。
log4j.appender.myFileAppender.MaxFileSize=1KB
log4j.appender.myFileAppender.MaxBackupIndex=2
log4j.appender.myFileAppender.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %m%n
package myappender;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
/**
* 自定义 rollingFileppender文件名格式
* @author abc
*
*/
public class MWLogFileAppender extends RollingFileAppender {
private long nextRollover = 0;
public void rollOver() {
File target;
File file;
if (qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
LogLog.debug("rolling over count=" + size);
// if operation fails, do not roll again until
// maxFileSize more bytes are written
nextRollover = size + maxFileSize;
}
LogLog.debug("maxBackupIndex=" + maxBackupIndex);
boolean renameSucceeded = true;
// If maxBackups <= 0, then there is no file renaming to be done.
if (maxBackupIndex > 0) {
// Delete the oldest file, to keep Windows happy.
//file = new File(fileName + '.' + maxBackupIndex);
file = new File(getRollingFileName(fileName, maxBackupIndex));
if (file.exists())
renameSucceeded = file.delete();
// Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3,
// 2}
for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
//file = new File(fileName + "." + i);
file = new File(getRollingFileName(fileName, i));
if (file.exists()) {
//target = new File(fileName + '.' + (i + 1));
target = new File(getRollingFileName(fileName, i+1));
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
}
}
if (renameSucceeded) {
// Rename fileName to fileName.1
//target = new File(fileName + "." + 1);
target = new File(this.getRollingFileName(fileName, 1));
this.closeFile(); // keep windows happy.
file = new File(fileName);
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
//
// if file rename failed, reopen file with append = true
//
if (!renameSucceeded) {
try {
this.setFile(fileName, true, bufferedIO, bufferSize);
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
LogLog.error("setFile(" + fileName
+ ", true) call failed.", e);
}
}
}
}
//
// if all renames were successful, then
//
if (renameSucceeded) {
try {
// This will also close the file. This is OK since multiple
// close operations are safe.
this.setFile(fileName, false, bufferedIO, bufferSize);
nextRollover = 0;
} catch (IOException e) {
if (e instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
LogLog.error("setFile(" + fileName + ", false) call failed.", e);
}
}
}
private String getRollingFileName(String fileName, int index) {
Pattern p = Pattern.compile("_\\d+\\.");
Matcher m=p.matcher(fileName);
return m.replaceFirst(String.format("_%d.", index));
}
public synchronized void setFile(String fileName, boolean append,
boolean bufferedIO, int bufferSize) throws IOException {
String processName = "01";
SimpleDateFormat format = new SimpleDateFormat("MMddyyyy");
String dateString = format.format(new Date(System.currentTimeMillis()));
String processId = String.valueOf(Thread.currentThread().getId());
String temp = String.format(fileName, processName, dateString,
processId);
//System.out.println(temp);
super.setFile(temp, append, bufferedIO, bufferSize);
}
protected void subAppend(LoggingEvent event) {
super.subAppend(event);
if (fileName != null && qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
if (size >= maxFileSize && size >= nextRollover) {
rollOver();
}
}
}
}
d