随笔 - 147  文章 - 71  trackbacks - 0
<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(1)

随笔分类(146)

随笔档案(147)

文章分类(28)

文章档案(28)

喜欢的Blog

搜索

  •  

最新评论

阅读排行榜

评论排行榜

引起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 飞翔天使 阅读(8557) 评论(1)  编辑  收藏 所属分类: log4j

FeedBack:
# re: log4j:ERROR Failed to rename错误解决办法[未登录] 2015-01-21 14:51 bobo
谢谢楼主,问题解决!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: