Log4j結合spring的使用配置

 

在我們的日常開發中,日誌記錄非常重要。 我們可以在測試中檢測代碼變量變化,跟蹤代碼運行軌跡。同時也可以創建一些基本的應用級別日誌功能。 Log4j是Apache的一個開放源代碼項目,它提供了一種細膩的日誌管理方式。 通過一個配置文件,我們可以多選擇的控制每條日誌的輸出格式和目的地。通過定義信息的級別,我們也可以靈活開關代碼中的反饋信息。在本文中,我們使用log4j在Spring環境的配置來演示日誌功能的使用。

在web.xml中的定義:

<context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>webApp.root</param-value>
 </context-param>

  <context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/classes/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>

 

實際應用中,我們在web.xml定義如下配置:首先log4jConfigLocation類定義log4j配置文件路徑。

Log4J's watchdog thread will asynchronously check whether the timestamp of the config file has changed, using the given interval between checks. A refresh interval of 1000 milliseconds (one second), which allows to do on-demand log level changes with immediate effect, is not unfeasible.

Log4jConfigListener是spring提供的工具類,它開啓一個log4j的監視線程,並每60(log4jRefreshInterval變量定義)秒檢測日誌配置變化,從而不需要每次重新啓動web服務來應用新的配置。在tomcat中沒有根據web應用來分開系統屬性。所以必須爲每一個web應用定義唯一的 "webAppRootKey",我們取名爲webApp.root. 在啓動環境後,Log4jConfigListener 會將某某值注入到webApp.root變量。具體什麼值,爲什麼我們這樣定義,請繼續往下來看。

下面的工作該log4j.properties的配置了。spring也支持xml的配置文件格式。
在項目中經常會有不同的日誌需求,比如數據庫操作日誌,郵件日誌 或者 用戶操作日誌。我們可以輸出所有的日誌到統一的文件,也可以根據功能模塊來定義不同的日誌文件。

log4j.logger.uk.salford.ian.site.mvc=DEBUG,stdout,model
log4j.logger.uk.salford.ian.site.service=DEBUG,stdout,db

在本例中,我們對兩個功能模塊做不同的日誌定義。uk.salford.ian.site.mvc 和 uk.salford.ian.site.service 爲同一項目的兩個包, 分別代表mvc模塊和service服務模塊。log4j支持包級的日誌定義,所以我們可以根據不同的功能模塊做相應的定義。並且值得注意的是,log4j支持包日誌的繼承。任何子包在mvc或者service下,可以繼承父的日誌定義。 DEBUG,stdout,model:DEBUG代表日誌的信息顯示級別。級別分爲OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裏定義的級別,您可以控制到應用程序中相應級別的日誌信息的開關。比如在這裏定義了INFO級別,則應用程序中所有DEBUG級別的日誌信息將不被打印出來。 stdout,model 爲 兩個自定義的 appender 名稱。

其中,Log4j提供的appender有以下幾種:
    org.apache.log4j.ConsoleAppender(控制檯),
    org.apache.log4j.FileAppender(文件),
    org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件),
    org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
    org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
 
下面我們再來看appender的定義

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5r [%5p][%c{2}] %m%n

stdout使用控制檯appender,所有日誌信息將直接顯示到控制檯。mvc和sevice不同的是,它們還使用自己唯一的appender:model 和db,這樣日誌信息將會被相應的兩個appender來管理。

model日誌的定義:
log4j.appender.model=org.apache.log4j.RollingFileAppender
log4j.appender.model.File=${webApp.root}/WEB-INF/logs/model/model.log
log4j.appender.model.Append=true
log4j.appender.model.MaxFileSize=1MB
log4j.appender.model.MaxBackupIndex=1
log4j.appender.model.layout=org.apache.log4j.PatternLayout
log4j.appender.model.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n

我們將model裏日誌信息輸出到${webApp.root}/WEB-INF/logs/model/model.log。 一個特別需要注意的地方是:log4j.appender.model.File=${webApp.root}/WEB-INF/logs/model/model.log
我們輸出信息到${webApp.root}/WEB-INF/logs/model/model.log。其中webApp.root值從哪兒來的呢,還記得我們在web.xml的定義嗎,在listener工作的時候,它就將網站目錄路徑注入到我們自定義的webApp.root變量。這樣,我們可以使用相對路徑來管理日誌路徑,而不是寫成絕對的 d:/log.log,諸如此類。


下面是db的定義,我們輸出db操作的日誌信息輸出到db目錄下的db文件。

log4j.appender.db=org.apache.log4j.FileAppender
log4j.appender.db.File=${webApp.root}/WEB-INF/logs/db/db.log
log4j.appender.db.Append=true
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n


最後是在類中的調用,非常簡單

 @InjectDisable
 static Logger logger = Logger.getLogger(IndexAction.class);
        logger.debug("it's show time?################################");
        logger.error("錯誤了嗎.好象沒有 ################################");
        logger.info("info就info撒################################");

注意:@InjectDisable是Easyjf中需要的。默認情況下,Easyjf會將屬性自動注入,通過@InjectDisable,我們可以關閉注入來自己管理屬性值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章