原文参考 http://blog.csdn.net/buoll/article/details/17389827
最近被LOG4J:ERROR Failed to rename折腾得差点放弃使用log4j了。
想象:log4j 不能按日生成新的日志文件,直接把原来的给覆盖了。
经过跟踪调试,问题出现在
DailyRollingFileAppender.Java的
[java] view plain copy
-
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 + "].");
-
}
"Failed to rename ... "
renameTo失败很明显就是日志文件被占用,但是日志文件会被哪些线程占用?
在网上找了半天,终于发现
罪魁祸首竟然是
tomcat 的 server.xml中配置了
[html] view plain copy
-
<Context path="" docBase="xxxx" debug="0" reloadable="true"/>
导致日志文件一直被占用,只有在停止tomcat时才被释放
。。。。。。。。。。。。。。。。。。。。。。。。 晕倒 。。。。。。。。。。。。。。
知道问题出现在哪就好解决了,当然是不要在server.xml中配置<Context path="" docBase="xxxx" debug="0" reloadable="true"/>
去掉该配置后,服务器的首页默认就在 webapps\ROOT\
如果想让自己的项目变成默认首页,那只能在ROOT\ 下增加一个自己项目的首页的文件了。
如果我一定要 在server.xml中配置<Context path="" docBase="xxxx" debug="0" reloadable="true"/>
还有没有其他的解决办法?
那就只能修改log4j-1.2.xx.jar的 DailyRollingFileAppender文件,网上提供的方法都是将 renameTO 改成copy
具体做法是:
将DailyRollingFileAppender.java的
[java] view plain copy
-
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 + "].");
-
}
改为:
[java] view plain copy
-
File file = new File(fileName);
-
boolean result = copy(file, target);
-
if (result) {
-
//网上很多地方只是简单的做复制操作,这样将导致日志文件越来越大。所以,这里应该增加清空日志的方法,在复制成功后,清空原来的日志
-
FileWriter fw = new FileWriter(file);
-
fw.write("");
-
fw.flush();
-
fw.close();
-
LogLog.debug(fileName + " -> " + scheduledFilename);
-
} else {
-
LogLog.error("Failed to rename [" + fileName + "] to ["
-
+ scheduledFilename + "].");
-
}
并且增加copy方法
[java] view plain 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;
-
}
-
}