Spring的Log4J配置器Log4jWebConfigurer介紹

1. Logj4簡介java

    Log4j是Apache大旗下的一個子項目,它能夠用來重定向應用日誌文件的輸出流,不管咱們想將日誌文件輸出到控制檯仍是網絡仍是其餘地方,均可以經過logj4來配置,若是咱們的應用裏面引入的Spring框架技術,咱們能夠經過Spring來初始化logj4的配置文件信息,下面2,3節是對Spring文檔的一些翻譯第4節是做者本身對一些問題的見解:web

2. Log4jWebConfigurer及主要配置參數spring

    Log4jWebConfigurer是一個方便的自定義log4j web環境的初始化配置工具類,由spring util包提供,能夠配置web應用的日誌文件輸出流路徑,提供自動刷新檢查的選項(這一般用於運行時日誌配置的變動)。警告:假設一個展開的WAR包,同時會加載配置文件和寫日誌文件。若是你不想展開你的WAR包或者你不須要應用級別的日誌文件存放在WAR目錄,那麼你就不要在應用中配置log4j(所以也不須要使用Log4jConfigListener或Log4jConfigServlet)。做爲替代,你可使用全局的,虛擬機範圍的log4j的配置(例如在jBoss容器中),或者JDK1.4提供的java.util.logging(這是個全局工具)。tomcat

在Servet上下文級別支持三個初始化參數,經過web.xml中的context-param參數配置。網絡

第一個參數:log4jCongLocation架構

指定logj4配置文件的位置,能夠經過classpath配置(例如:classpath:myLog4j.properties),也能夠經過絕對路徑配置(如:C:/log4j.properties)或相對路徑配置,/WEB-INF/log4j.properties。若是沒有指定,默認的log4j初始化配置將會使用classpath路徑下的log4j.properties或者log4j.xml文件。app

第二個參數:log4jRefreshInterval框架

兩次檢查配置的時間間隔,單位是毫秒,若是沒有配置刷新時間間隔,log4j將不會在運行時刷新配置,這將不會啓動log4j的看門狗服務。webapp

第三個參數:log4jExposeWebAppRoot異步

Web應用根系統屬性是否被暴露,使得能夠得到日誌文件相對於web應用的根目錄路徑。默認值是」true」,能夠設置爲」false」來禁止暴露web應用的根系統屬性。下面來看看詳細的介紹,怎樣使用這個系統屬性來配置日誌文件的路徑。

注意:initLogging方法必須在使用log4j的其餘spring組件啓動以前調用,所以logj4的配置監聽器在web.xml中的位置將會在spring其餘組件啓動監聽器以前。

3. log4j配置看門狗服務

    log4j的看門狗服務是由一個線程實現的,看門狗服務會異步的檢查對應時間戳點的日誌配置文件是否有變動,檢查時間間隔參數來自用戶的配置。同時要知道1000毫秒,也就是1秒中的檢查時間間隔來檢查日誌級別的配置變動方案是不可行的,同時實際運行時檢查時間間隔相對於配置也有必定的時間偏差,請不要過度糾結。

警告::Logj4的看門狗服務線程將不會終止直到虛擬機進程中止。實際上,看門狗線程並不能經過LogManager來終止。所以,咱們並不建議在j2ee應用的生產環境上使用配置文件刷新服務,若是不須要定時刷新配置文件的話看門狗服務就不會被喚醒,由於即便應用關閉,看門狗線程也不會被shutdown,這個時候有可能會形成資源泄露。

默認狀況下,這個配置器會自動配置web應用的根系統目錄,在日誌文件配置中用${key}替代,也能夠配置相對路徑。默認的系統屬性key是webapp.root,在log4j配置文件中像下面這樣使用:log4j.appender.myfile.File=${webapp.root}/WEB-INF/demo.log

同時每一個web應用應該指定一個惟一的web上下文參數webAppRootKey,例如:

"webAppRootKey = "demo.root」:

log4j.appender.myfile.File=${demo.root}/WEB-INF/demo.log

警告:一些容器,像tomcat這種,將不會爲每一個web應用保存一份獨立的系統參數,所以你須要爲每一個web應用配置一個上下文參數webAppRootKey來避免衝突,其餘應用像,Resin這種會自動隔離每一個web應用的系統屬性,,所以在這種容器中可使用默認的webAppRootKey。

4. JVM級別的線程的一些問題

    上面看門狗服務的介紹引出了一個問題,當咱們須要使用看門狗服務來在運行時爲咱們刷新日誌配置的時候也爲應用埋下了一個隱患。舉個例子,咱們使用tomcat容器來運行咱們的web應用,而咱們web應用的線程依賴tomcat線程,這是由tomcat架構決定的,tomcat應用能夠看作是一個依賴於虛擬機的進程。當一個web應用啓動的時候開啓瞭如看門狗這樣的一個線程,這個線程只能在虛擬機進程關閉的時候纔可以關shutdown,若是在線程中分配了一些資源,如在ThreadLocal中存儲一些對象信息,這些內存遲遲得不到釋放,即便在應用shutdown關閉的時候也同樣,由於這個時候tomcat進程還在,虛擬機進程還在。一種作法就是在進程中去配置一個鉤子點,在應用進程掛掉的時候來假shutdown掉這個線程,固然之因此我說「假」字,是由於咱們不能回收一個線程資源,只可以清理掉線程引用的一些資源,至少這樣能讓內存回收工做交給垃圾回收器來處理,咱們不能回收線程。以後線程會由tomcat回收利用,用於其餘web應用的調度

轉自:https://www.tuicool.com/articles/nuUVZr

相關文章
相關標籤/搜索