记一次log4j日志文件输出错误的解决

log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ].apache

原由:部门网站使用B/S架构请求,请求过程当中须要将日志文件记录下来,以便出现问题进行查找,刚开始服务器上的日志文件可以正常输出,后来日志文件不能输出,部门领导让我查找缘由并修改。服务器

介绍:本人JAVA小白一枚,以前是学.Net出身,来到公司以后因为公司须要才转的JAVA,日志输出作的比较少因此部门经理刚交给个人时候内心仍是小忐忑的。架构

目的:使用log4j的DailyRollingFileAppender天天生成一个日志文件,并在生成的日志文件以后添加日期做为标识,如wmts_2015-12-21.log。app

试验期:eclipse

 

一、(小白入门)网站

log4j.properties配置以下spa

 

1 log4j.appender.Info = org.apache.log4j.DailyRollingFileAppender
2 log4j.appender.Info.File = ${log4j.log.dir}/wmts_
3 log4j.appender.Info.DatePattern = yyyy-MM-dd'.log' 
4 log4j.appender.Info.Append = false
5 log4j.appender.Info.Threshold = INFO
6 log4j.appender.Info.layout = org.apache.log4j.PatternLayout
7 log4j.appender.Info.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %c:%r ] - [ %p ]  %m%n

 

原觉得每次请求都会生成相似“wmts_2015-12-21.log”的文件,后来才知道当天的日志会先建立在“wmts_”文件中,次日才会之前一天的日期生成日志文件。debug

可是通过屡次的试验,一直没有生成正确命名的日志文件。日志

二、(C/S尝试)code

(1)鉴于上面的试验一直没有成功,本人想到多是本人的修炼还不够,一上手就用成型的项目可能有些问题很差发现,因此本人写了最简单的C/S的Demo来跟踪日志的生成。

log4j.properties的配置以下:

1 log4j.appender.R1=org.apache.log4j.RollingFileAppender
2 log4j.appender.R1.file=C:/demo.log
3 log4j.appender.R1.layout=org.apache.log4j.PatternLayout
4 log4j.appender.R1.layout.conversionPattern=%d %c (%M:%L) - %m%n

生成日志文件正常。

(2)更改log4j.properties为项目的配置:

1 log4j.appender.Info = org.apache.log4j.DailyRollingFileAppender
2 log4j.appender.Info.File = ${log4j.log.dir}/wmts_
3 log4j.appender.Info.DatePattern = yyyy-MM-dd'.log' 
4 log4j.appender.Info.Append = true
5 log4j.appender.Info.Threshold = INFO
6 log4j.appender.Info.layout = org.apache.log4j.PatternLayout
7 log4j.appender.Info.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %c:%r ] - [ %p ]  %m%n

再次生成日志文件,此时eclipse的console输出了错误代码log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ].

这个错误提示帮我最后解决了问题。

三、问题解决

引发log4j:ERROR Failed to rename的条件 

一般都是在配置文件采用

1 log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender  

或者 

 

1 log4j.appender.A1=org.apache.log4j.RollingFileAppender  

 

 

的状况下遇到"异常"提示。

缘由:

 

1 File file = new File(fileName);
2     boolean result = file.renameTo(target);
3     if(result) {
4       LogLog.debug(fileName +" -> "+ scheduledFilename);
5     } else {
6       LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
7     }

 

源代码中使用renameTo将前一天的文件重命名为log4j.properties配置的文件名,可是有的时候该文件会被占用,致使没法进行重命名,才会报上一步的错误。

大神们的解决办法:在log4j中添加一个copy方法,在重命名前一天的日志文件时,将原文件拷贝一份,将拷贝的原文件命名为想要的文件名,来解决该问题。

copy方法的代码以下:

 1 /**
 2      * Copies src file to dst file. If the dst file does not exist, it is
 3      * created.8KB cache
 4      * 
 5      * @param src
 6      * @param dst
 7      * @throws IOException
 8      */
 9     boolean copy(File src, File dst) throws IOException {
10         try {
11             InputStream in = new FileInputStream(src);
12 
13             OutputStream out = new FileOutputStream(dst);
14 
15             // Transfer bytes from in to out
16             byte[] buf = new byte[8192];
17             int len;
18             while ((len = in.read(buf)) > 0) {
19                 out.write(buf, 0, len);
20             }
21             in.close();
22             out.close();
23             return true;
24         } catch (FileNotFoundException e) {
25             LogLog.error("源文件不存在,或者目标文件没法被识别." );
26             return false;
27         } catch (IOException e) {
28             LogLog.error("文件读写错误.");
29             return false;
30         }
31     }

四、心得

  问题解决以后回想以前的解决过程,删除每次的日志文件的时候系统提示文件正在占用,中止eclipse的server以后才能删除文件,当时若是认真思考这个问题可能就会发现日志输出不正常的问题。于此给我敲响了警钟,要多思考一些系统给出的提示信息。

附上打包好的log4j-1.2.15.jar文件

http://files.cnblogs.com/files/giser-liang/log4j-1.2.15.zip

相关文章
相关标签/搜索