Tomcat6下配置log4j
log4j配置到tomcat6可以看这里,
tomcat6下配置log4j
引起log4j:ERROR Failed to rename的原因
引起log4j:ERROR Failed to rename的原因大致为
引用
关于使用renameTo需要注意的事项, 请看
请慎用java的File#renameTo(File)方法 ,
File.renameTo方法在linux下的问题
引起log4j:ERROR Failed to rename的条件
通常都是在配置文件采用
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
或者
log4j.appender.A1=org.apache.log4j.RollingFileAppender
的情况下遇到"异常"提示.
和异常相关的log4j源代码
查看log4j的源代码,和
log4j:ERROR Failed to rename异常相关的代码为
/**
Rollover the current file to a new file.
*/
void rollOver() throws IOException {
/* Compute filename, but only if datePattern is specified */
if (datePattern == null) {
errorHandler.error("Missing DatePattern option in rollOver().");
return;
}
String datedFilename = fileName+sdf.format(now);
// It is too early to roll over because we are still within the
// bounds of the current interval. Rollover will occur once the
// next interval is reached.
if (scheduledFilename.equals(datedFilename)) {
return;
}
// close current file, and rename it to datedFilename
this.closeFile();
File target = new File(scheduledFilename);
if (target.exists()) {
target.delete();
}
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+"].");
}
try {
// This will also close the file. This is OK since multiple
// close operations are safe.
this.setFile(fileName, false, this.bufferedIO, this.bufferSize);
}
catch(IOException e) {
errorHandler.error("setFile("+fileName+", false) call failed.");
}
scheduledFilename = datedFilename;
}
/**
* This method differentiates DailyRollingFileAppender from its
* super class.
*
* <p>Before actually logging, this method will check whether it is
* time to do a rollover. If it is, it will schedule the next
* rollover time and then rollover.
* */
protected void subAppend(LoggingEvent event) {
long n = System.currentTimeMillis();
if (n >= nextCheck) {
now.setTime(n);
nextCheck = rc.getNextCheckMillis(now);
try {
rollOver();
}
catch(IOException ioe) {
LogLog.error("rollOver() failed.", ioe);
}
}
super.subAppend(event);
}
}
重点在这里
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+"].");
}
解决办法
解决办法为修改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;
}
}
此方法借鉴自
File Copy in Java 和
Java File Copy
后面的话
修改后的代码可以正常运行在tomcat6下, log文件替换正常. 没有高负载和集群环境下测试. 如有问题,还请大家积极反馈.
如果你有更好的办法请告诉我.
附件 : 包括修改后的
org.apache.log4j.DailyRollingFileAppender类的源代码和已编译好的文件.
请用DailyRollingFileAppender.class替换log4j-1.2.15.jar包里相应的类.
参考资料 :
http://logging.apache.org/
tomcat6下配置log4j
Log4J DailyRollingFileAppender 問題
请慎用java的File#renameTo(File)方法
File.renameTo方法在linux下的问题
File Copy in Java
Java File Copy
log4j 简明手册
- DailyRollingFileAppender.zip (8.2 KB)
- 描述: 包括修改后的[color=darkred]org.apache.log4j.DailyRollingFileAppender[/color]类的源代码和已编译好的文件.
请用DailyRollingFileAppender.class替换log4j-1.2.15.jar包里相应的类.
- 下载次数: 609
分享到:
相关推荐
log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。要修改log4j的源码,附件是我修改好后的,方便大家...
解决log4j:ERROR Failed to rename, win系统占用文件无法改名字的问题
log4j:ERROR Failed to rename
log4j:ERROR Failed to rename错误解决办法 http://www.blogjava.net/DreamAngel/archive/2011/11/10/363400.html
log4j:ERROR Failed to rename错误解决办法,修改源码里的DailyRollingFileAppender类,用此jar包就不会再出现ERROR Failed to rename的错误了
针对log4j:ERROR Failed to rename的问题,修改源代码中的DailyRollingFileAppender.java文件,将rename改为copy。 该log4j-1.2.15.jar,就是修改后的jar包。 已经过测试,可以正常生成日志文件。
log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。要修改log4j的源码,附件是我修改好后的,方便大家...
以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名、移动文件的目的。不过后来经常发现问题:File#renameTo(File)方法会返回失败(false),文件没有移动,又查不出原因,再后来...
Visual C++中,用MFC的CFile::Rename给文件改名
问题描述: 在使用git 进行提交时, 出现上面这个报错, 导致无法提交. 报错大致意思就是创建index.lock文件失败,因为已经存在index.lock文件了. index.lock文件是在.git下面, 而.git是一般是隐藏的, 那么可以通过以下...
前言 最近发现了一个问题,运行 npm ... Error: EPERM: operation not permitted, rename ‘/usr/share/nginx/html/tanteng.me/node_modules/duplexify' -> ‘/usr/share/nginx/html/tanteng.me/node_modules/.duple
使用Python的rename()函数重命名文件时出现问题,提示 WindowsError: [Error 2] 错误,最初代码如下: def renameFile(filename): filePre = D:\\FileDemo\\Python\\pt.py os.rename(filePre, filename) ...
Freerename是一款功能强大并且操作简便的文件改名工具,没有任何使用限制,可以对所有的文件进行快速方便的重命名。 功能介绍 支持对文件及文件夹进行更名; 可以更改文件及文件夹的属性; 可以更改...
Error: EXDEV: cross-device link not permitted, rename ‘C:\Users\THEDIS~1\AppData\Local\Temp\upload_9b46f1afc2f9ade074037c3fb707d271’ -> ‘E:/node-rumen/tmp/test.png’ 文件上传的功能时候,调用fs....
SQL Server: DB rename by sql
Tag Rename可以重命名MP3音乐,通过MP3音乐内置的TAG标签来重新命名你的歌曲文件,编辑文件夹封面艺术,多文件标签管理器编辑音乐的注释,编辑文件标题艺术家,所属专辑及音乐年份,作曲家及原始艺术家等信息,还...
WebStorm 启动失败 ErrOr: ENOENTI: no such file or directory, open ‘D: \project \Areallagic\test \logs \log-2019-03-29. log 问题描述: 最近刚开始学习node.js,使用webStorm写demo时经常报这个错。 使用这个...