1. 程式人生 > >Spring的Log4J配置器Log4jWebConfigurer介紹

Spring的Log4J配置器Log4jWebConfigurer介紹

為我 manager XML webconfig 即使 工作 file interval 出了

1. Logj4簡介

Log4j是Apache大旗下的一個子項目,它可以用來重定向應用日誌文件的輸出流,無論我們想將日誌文件輸出到控制臺還是網絡還是其他地方,都可以通過logj4來配置,如果我們的應用裏面引入的Spring框架技術,我們可以通過Spring來初始化logj4的配置文件信息,下面2,3節是對Spring文檔的一些翻譯第4節是作者自己對一些問題的看法:

2. Log4jWebConfigurer及主要配置參數

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

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

第一個參數:log4jCongLocation

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

第二個參數:log4jRefreshInterval

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

第三個參數: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

Spring的Log4J配置器Log4jWebConfigurer介紹