記一次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

相關文章
相關標籤/搜索