隨筆 - 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
          謝謝樓主,問題解決!  回復  更多評論
            

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


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 离岛区| 五华县| 孝昌县| 沿河| 泰顺县| 孟村| 铜陵市| 荥阳市| 米脂县| 嘉义县| 昌平区| 堆龙德庆县| 克东县| 新野县| 平湖市| 河北区| 方城县| 新巴尔虎右旗| 卢氏县| 乾安县| 蒲城县| 临澧县| 井陉县| 彭泽县| 湘阴县| 桃园市| 龙海市| 小金县| 景泰县| 航空| 青冈县| 孝昌县| 涟源市| 韩城市| 曲靖市| 锦屏县| 工布江达县| 东丰县| 岢岚县| 子长县| 崇州市|