Log4j使用相對路徑指定log檔案及使用總結
Log4j在指定log檔案位置時一般是使用絕對路徑,這樣在部署環境發生變化時顯得十分麻煩,在網上找了很多種方法,個人感覺以下方法比較適用:
由於spring也會載入log4j.properties,如果載入不到就往控制檯打log資訊。Spring提供了 一個Log4jConfigListener,本身就能通過web.xml中配置來指定位置載入log4j配置檔案和log輸出路徑,注意該 listener需要放在spring的Listener之前。
事實上,Log4jConfigListener更適合log4j在web工程中使用,原因如下:
1. 動態的改變記錄級別和策略,不需要重啟Web應用,如《Effective Enterprise Java》所說。
2. 把log檔案定在 /WEB-INF/logs/ 而不需要寫絕對路徑。
因為 系統把web目錄的路徑壓入一個叫webapp.root的系統變數。這樣寫log檔案路徑時不用寫絕對路徑了.
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/settlement.log
3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
4. log4jRefreshInterval為60000表示 開一條watchdog執行緒每60秒掃描一下配置檔案的變化;
在web.xml 新增
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>WEB-INF/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
log4j配置檔案如下:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.rootLogger=info, stdout,R log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=${webapp.root}/WEB-INF/logs/settlement.log log4j.appender.R.DatePattern = "."yyyy-MM log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d %p [%c] - %m%n
另:
Log4j提供的appender有以下幾種
o org.apache.log4j.ConsoleAppender(控制檯)
o org.apache.log4j.FileAppender(檔案)
o org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案)
o org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
o org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
我們開發的B/S結構系統,在服務端一般要有日常執行的日誌記錄。儲存成日誌檔案形式的時候,大家經常會遇到一個問題:日誌檔案過大。上百兆的日誌檔案對 查閱日誌資訊來說也是一個問題。所以我希望能夠每天或每個月產生一個日誌檔案,這樣檔案不至於過大。 或者根據日誌檔案大小來判斷,超過規定大小,日誌自動增加新檔案。
在log4j中這兩種方式的實現都很簡單,只要在配置檔案中設定即可。
一、按照一定時間產生日誌檔案,配置檔案如下:
# Set root logger level to ERROR and its only appender to A1.
log4j.rootLogger=ERROR,R
# R is set to be a DailyRollingFileAppender.
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=backup.log
log4j.appender.R.DatePattern = "."yyyy-MM-dd
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
以上配置是每天產生一個備份檔案。其中備份檔案的名字叫backup.log。
具體的效果是這樣:當天的日誌資訊記錄在backup.log檔案中,前一天的記錄在名稱為 backup.log.yyyy-mm-dd 的檔案中。
類似的,如果需要每月產生一個檔案可以修改上面的配置:
將
log4j.appender.R.DatePattern = "."yyyy-MM-dd
改為
log4j.appender.R.DatePattern = "."yyyy-MM
二、根據日誌檔案大小自動產生新日誌檔案
配置檔案內容如下:
# Set root logger level to ERROR and its only appender to A1.
log4j.rootLogger=ERROR,R
# R is set to be a RollingFileAppender.
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=backup.log
#log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
其中:
#日誌檔案的大小
log4j.appender.R.MaxFileSize=100KB
# 儲存一個備份檔案
log4j.appender.R.MaxBackupIndex=1
另:
日誌顯示級別:
它們定義了日誌顯示的級別,一共分為五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,明白這一點很重要,這裡Log4j有一個規則:假設設定了級別為P,如果發生了一個級別Q比P高,則可以啟動,否則遮蔽掉。