天天看點

log4j:ERROR Failed to rename錯誤

使用Log4j記錄日志,遇到一個煩心的問題,就是每天建立新日志檔案時(日志檔案設定為:org.apache.log4j.DailyRollingFileAppender)報:log4j:ERROR Failed to rename錯誤; 

      經過一翻查找,最終知道導緻這一錯誤的罪魁禍首是在Tomcat server.xml中所設定的<Context docBase="xxxx" path="/" reloadable="true"/>所導緻的,由于加了這一設定,日志檔案始終被其占有,是以當log4j對日志檔案進行rename時,就發生了Failed to rename錯誤 。

     由于log4j在實作日志檔案備份時使用的是file.renameTo(File)方法:

log4j:ERROR Failed to rename錯誤

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.properties配置:

 ### set log levels ###  

log4j.rootLogger = debug , stdout , D , E  

### 輸出到控制台 ###  

log4j.appender.stdout = org.apache.log4j.ConsoleAppender  

log4j.appender.stdout.Target = System.out  

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  

log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  

### 輸出到日志檔案 ###  

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  

log4j.appender.D.File = logs/log.log  

log4j.appender.D.Append = true  

log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級别以上的日志  

log4j.appender.D.layout = org.apache.log4j.PatternLayout  

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n  

### 儲存異常資訊到單獨檔案 ###  

log4j.appender.D.File = logs/error.log ## 異常日志檔案名  

log4j.appender.D.Threshold = ERROR ## 隻輸出ERROR級别以上的日志!!!  

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

### 儲存異常資訊到單獨檔案,并且日志檔案每天滾動一次 ###  

log4j.appender.D.DatePattern='_'yyyy-MM-dd-HH-mm

ConversionPattern:

%p:輸出日志資訊的優先級,即DEBUG,INFO,WARN,ERROR,FATAL。

%d:輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。

%r:輸出自應用程式啟動到輸出該log資訊耗費的毫秒數。

%t:輸出産生該日志事件的線程名。

%c:輸出日志資訊所屬的類目,通常就是所在類的全名。

%M:輸出産生日志資訊的方法名。

%F:輸出日志消息産生時所在的檔案名稱。

%L::輸出代碼中的行号。

%m::輸出代碼中指定的具體日志資訊。

%n:輸出一個回車換行符,Windows平台為"/r/n",Unix平台為"/n"。

%x:輸出和目前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。

%%:輸出一個"%"字元。

本文轉自lzf0530377451CTO部落格,原文連結:http://blog.51cto.com/8757576/1833898 ,如需轉載請自行聯系原作者