引起log4j:ERROR Failed to rename的原因
根據Log4J的配置文件,使用LOG4J的DailyRollingFileAppender.java實現每隔一段時間記錄一次日志文件,但LOG4J在對原文件改名時,總是提示log4j:ERROR Failed to rename的錯誤,究其原因,主要是還有進程在使用原來的LOG文件,而通過分析LOG4J的源碼,發現LOG4J是采用RENAME的方式對原來的LOG文件改名再生成新文件。
引起log4j:ERROR Failed to rename的條件
通常都是在配置文件采用Java代碼
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
或者
log4j.appender.A1=org.apache.log4j.RollingFileAppender
的情況下遇到"異常"提示。
和異常相關的log4j源代碼
File file = new File(fileName);
boolean result = file.renameTo(target);
if(result) {
LogLog.debug(fileName +" -> "+ scheduledFilename);
} else {
LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
}
File類的renameTo方法的作用是:“改名或者移動文件作用;在同一個目錄下renameTo是改名,在不同目錄下是移動”,所以在對一個被其他線程所鎖定的文件進行改名時,肯定是會報錯的。
解決辦法
修改log4j的源代碼, 將
boolean result = file.renameTo(target);
改為
boolean result = copy(file, target);
然后再添加copy()方法。
/**
* Copies src file to dst file. If the dst file does not exist, it is
* created.8KB cache
*
* @param src
* @param dst
* @throws IOException
*/
boolean copy(File src, File dst) throws IOException {
try {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
return true;
} catch (FileNotFoundException e) {
LogLog.error("源文件不存在,或者目標文件無法被識別." );
return false;
} catch (IOException e) {
LogLog.error("文件讀寫錯誤.");
return false;
}
}
附件:DailyRollingFileAppender.zip
posted on 2011-11-10 11:48
飛翔天使 閱讀(8641)
評論(1) 編輯 收藏 所屬分類:
log4j