81,092
社区成员
发帖
与我相关
我的任务
分享
public class ExRollingFileAppender extends RollingFileAppender {
private long nextRollover = 0;
private static Map<String, BeginFileData> fileMaps = new HashMap<String, BeginFileData>();
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
/**
* 重写父类的方法
*/
public void rollOver() {
File target;
File file;
int maxBackupIndexLeng = String.valueOf(maxBackupIndex).length();
if (qw != null) {
long size = ((CountingQuietWriter) qw).getCount();
LogLog.debug("rolling over count=" + size);
nextRollover = size + maxFileSize;
}
LogLog.debug("maxBackupIndex=" + maxBackupIndex);
String nowDateString = sdf.format(new Date());
String newFileName = (fileName.indexOf(".") != -1
? fileName.substring(0, fileName.lastIndexOf("."))
: fileName);
boolean renameSucceeded = true;
/** 如果maxBackups <= 0,那么文件不用重命名 **/
if (maxBackupIndex > 0) {
/** 删除旧文件 **/
file = new File(newFileName + '_'
+ getIndex(maxBackupIndex, maxBackupIndexLeng));
if (file.exists()) {
renameSucceeded = file.delete();
}
for (int i = maxBackupIndex - 1; (i >= 1 && renameSucceeded); i--) {
file = new File(newFileName + '_'
+ getIndex(i, maxBackupIndexLeng));
if (file.exists()) {
target = new File(newFileName + '_'
+ getIndex(i + 1, maxBackupIndexLeng));
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
}
}
if (renameSucceeded) {
BeginFileData beginFileData = fileMaps.get(fileName);
/** 在每天一个日志目录的方式下,检测日期是否变更了,如果变更了就要把变更后的日志文件拷贝到变更后的日期目录下。 **/
if (newFileName.indexOf(nowDateString) == -1
&& beginFileData.getFileName().indexOf("yyyyMMdd") != -1) {
newFileName = beginFileData.getFileName().replace(
"yyyyMMdd", nowDateString);
newFileName = (newFileName.indexOf(".") != -1 ? newFileName
.substring(0, newFileName.lastIndexOf("."))
: newFileName);
}
target = new File(newFileName + '_'
+ getIndex(1, maxBackupIndexLeng));
this.closeFile();
file = new File(fileName);
LogLog.debug("Renaming file " + file + " to " + target);
renameSucceeded = file.renameTo(target);
/** 如果重命名失败,重新打开文件,并在文件上追加 **/
if (!renameSucceeded) {
try {
this.setFile(fileName, true, bufferedIO, bufferSize);
} catch (IOException e) {
LogLog.error("setFile(" + fileName
+ ", true) call failed.", e);
}
}
}
}
/** 重命名成功 **/
if (renameSucceeded) {
try {
this.setFile(fileName, false, bufferedIO, bufferSize);
nextRollover = 0;
} catch (IOException e) {
LogLog.error("setFile(" + fileName + ", false) call failed.", e);
}
}
}
/**
* 文件个数的长度补零,如果文件个数为10那么文件的个数长度就是2位,第一个文件就是01,02,03....
*
* @param i
* @param maxBackupIndexLeng
* @return
*/
private String getIndex(int i, int maxBackupIndexLeng) {
String index = String.valueOf(i);
int len = index.length();
for (int j = len; j < maxBackupIndexLeng; j++) {
index = "0" + index;
}
return index + ".log";
}
/**
* 重写 RollingFileAppender的方法
*
* @since 0.9.0
*/
protected void subAppend(LoggingEvent event) {
super.subAppend(event);
if (fileName != null && qw != null) {
String nowDate = sdf.format(new Date());
/** 检测日期是否已经变更了,如果变更了就要重创建文件 **/
if (!fileMaps.get(fileName).getDate().equals(nowDate)) {
rollOver();
return;
}
/** 检测文件大小,超过指定大小重新创建文件 **/
long size = ((CountingQuietWriter) qw).getCount();
if (size >= maxFileSize && size >= nextRollover) {
rollOver();
}
}
}
@Override
public synchronized void setFile(String fileName, boolean append,
boolean bufferedIO, int bufferSize) throws IOException {
String nowDate = sdf.format(new Date());
/** 如果文件路径包含了“yyyyMMdd”就是每天一个日志目录的方式记录日志(第一次的时候) **/
if (fileName.indexOf("yyyyMMdd") != -1) {
String beginFileName = fileName;
fileName = fileName.replace("yyyyMMdd", nowDate);
fileMaps.put(fileName, new BeginFileData(beginFileName, nowDate));
}
BeginFileData beginFileData = fileMaps.get(fileName);
/** 检测日期是否已经变更了,如果变更了就要把原始的字符串给fileName变量,把变更后的日期做为开始日期 **/
if (!beginFileData.getDate().equals(nowDate)) {
/** 获取出第一次的文件名 **/
beginFileData.setDate(nowDate);
fileName = beginFileData.getFileName().replace("yyyyMMdd", nowDate);
fileMaps.put(fileName, beginFileData);
}
super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
}
class BeginFileData {
public BeginFileData(String fileName, String date) {
super();
this.fileName = fileName;
this.date = date;
}
private String fileName;
private String date;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
}