使用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)方法:

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 ,如需轉載請自行聯系原作者