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

          常用鏈接

          留言簿(1)

          隨筆分類(146)

          隨筆檔案(147)

          文章分類(28)

          文章檔案(28)

          喜歡的Blog

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          引起log4j:ERROR Failed to rename的原因
          根據(jù)Log4J的配置文件,使用LOG4J的DailyRollingFileAppender.java實現(xiàn)每隔一段時間記錄一次日志文件,但LOG4J在對原文件改名時,總是提示log4j:ERROR Failed to rename的錯誤,究其原因,主要是還有進(jìn)程在使用原來的LOG文件,而通過分析LOG4J的源碼,發(fā)現(xiàn)LOG4J是采用RENAME的方式對原來的LOG文件改名再生成新文件。

          引起log4j:ERROR Failed to rename的條件
          通常都是在配置文件采用Java代碼
          log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
          或者 
          log4j.appender.A1=org.apache.log4j.RollingFileAppender
          的情況下遇到"異常"提示。

          和異常相關(guān)的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是改名,在不同目錄下是移動”,所以在對一個被其他線程所鎖定的文件進(jìn)行改名時,肯定是會報錯的。

          解決辦法
          修改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(
          "源文件不存在,或者目標(biāo)文件無法被識別." );   
                              
          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
          謝謝樓主,問題解決!  回復(fù)  更多評論
            

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 清镇市| 抚州市| 察隅县| 渝中区| 石门县| 盐源县| 冀州市| 宁波市| 新泰市| 内黄县| 桓台县| 长海县| 卢湾区| 寿阳县| 仁布县| 界首市| 隆尧县| 花垣县| 宜兴市| 梁河县| 武宁县| 城市| 儋州市| 保德县| 河南省| 阿合奇县| 沾益县| 乐都县| 樟树市| 获嘉县| 垫江县| 红原县| 墨竹工卡县| 福安市| 新余市| 长海县| 梅河口市| 东台市| 溧水县| 晋州市| 洛隆县|