隨筆 - 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 飛翔天使 閱讀(8646) 評論(1)  編輯  收藏 所屬分類: log4j

          FeedBack:
          # re: log4j:ERROR Failed to rename錯誤解決辦法[未登錄] 2015-01-21 14:51 bobo
          謝謝樓主,問題解決!  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 梁河县| 乐清市| 友谊县| 宝丰县| 六盘水市| 永兴县| 大港区| 昌邑市| 惠水县| 南平市| 陆川县| 新兴县| 建水县| 枣强县| 利辛县| 连江县| 五大连池市| 金沙县| 广东省| 合肥市| 德安县| 凉山| 纳雍县| 黄山市| 澎湖县| 隆回县| 游戏| 防城港市| 承德市| 马关县| 武乡县| 建阳市| 博乐市| 吉林省| 沙雅县| 澜沧| 天气| 乌鲁木齐县| 尤溪县| 上高县| 法库县|