记⼀次log4j⽇志⽂件输出错误的解决
log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ].
起因:部门⽹站使⽤B/S架构请求,请求过程中需要将⽇志⽂件记录下来,以便出现问题进⾏查,刚开始服务器上的⽇志⽂件能够正常输出,后来⽇志⽂件不能输出,部门领导让我查原因并修改。
介绍:本⼈JAVA⼩⽩⼀枚,之前是学.Net出⾝,来到公司之后由于公司需要才转的JAVA,⽇志输出做的⽐较少所以部门经理刚交给我的时候⼼⾥还是⼩忐忑的。
⽬的:使⽤log4j的DailyRollingFileAppender每天⽣成⼀个⽇志⽂件,并在⽣成的⽇志⽂件之后添加⽇期作为标识,如wmts_2015-12-21.log。
试验期:
1、(⼩⽩⼊门)
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 = 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_”⽂件中,第⼆天才会以前⼀天的⽇期⽣成⽇志⽂件。
但是经过多次的试验,⼀直没有⽣成正确命名的⽇志⽂件。
2、(C/S尝试)
(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.versionPattern=%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 ].
这个错误提⽰帮我最后解决了问题。
3、问题解决
引起log4j:ERROR Failed to rename的条件
log4j与log4j2通常都是在配置⽂件采⽤
1 log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
或者
1 log4j.appender.A1=org.apache.log4j.RollingFileAppender
的情况下遇到"异常"提⽰。
原因:
1 File file = new File(fileName);
2boolean result = ameTo(target);
3if(result) {
4      LogLog.debug(fileName +" -> "+ scheduledFilename);
5    } else {
6      ("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*/
9boolean copy(File src, File dst) throws IOException {
10try {
11            InputStream in = new FileInputStream(src);
12
13            OutputStream out = new FileOutputStream(dst);
14
15// Transfer bytes from in to out
16byte[] buf = new byte[8192];
17int len;
18while ((len = in.read(buf)) > 0) {
19                out.write(buf, 0, len);
20            }
21            in.close();
22            out.close();
23return true;
24        } catch (FileNotFoundException e) {
25            ("源⽂件不存在,或者⽬标⽂件⽆法被识别." );
26return false;
27        } catch (IOException e) {
28            ("⽂件读写错误.");
29return false;
30        }
31    }
4、⼼得
  问题解决之后回想之前的解决过程,删除每次的⽇志⽂件的时候系统提⽰⽂件正在占⽤,停⽌eclipse的server之后才能删除⽂件,当时如果认真思考这个问题可能就会发现⽇志输出不正常的问题。于此给我敲响了警钟,要多思考⼀些系统给出的提⽰信息。
附上打包好的log4j-1.2.15.jar⽂件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。