熱切換Log4j級別配置

歡迎和大家交流技術相關問題: 郵箱: [email protected] 博客園地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/people/jiangxinnju

做一個產品或者項目,在測試時一般要打印詳細的log,發佈以後,因爲打印日誌會損失性能,所以通常在生產機上將log4j級別設置爲最高,以提高效率,一旦客戶那裏出了問題,需要查看詳細的日誌信息來跟蹤問題,此時打印日誌就是很重要的事情。這就需要在應用開發不重啓的情況下,動態切換log4j日誌策略了。

目前有兩種方式可以實現熱切換Log4j級別配置,一是定時刷新log4j配置文件,二是調用setlevel()動態設置。

定時刷新log4j配置文件

使用log4j原生動態更新配置文件的方法

使用log4j自帶的動態更新配置很簡單,只要調用 PropertyConfigurator 或者 DOMConfigurator類的 configureAndWatch(String configFileName)或者 configureAndWatch(String configFileName, long delay)方法就可以了。其中configFileName值配置文件的路徑加文件名,delay指掃描配置文件是否改變的間隔時間,默認值是 60 秒。在調用時log4j會創建一個線程,定時的去檢查配置文件是否改變,如果改變的話就重新加載配置文件。需要注意的是在log4j中每調用一次configureAndWatch方法都會啓動一個新的掃描線程,

實例代碼參考:Log4jHotChangeWatchdog

使用觸發方式更新配置文件

我們可以通過configureAndWatch方法來進行動態的改變log4j的配置,但是他採用了輪詢方式來實現的,現在我們需要某種觸發機制自己調用PropertyConfigurator對象的configure(String configFilename)方法重新加載log4j的配置。觸發機制需要聯繫實際業務,如果是一個web應用,就通過頁面來調用。如果是WebService應用,就使用開發的服務來調用。

實例代碼參考:log4jReload.jsp

使用Spring定時更新配置文件

spring通過org.springframework.util. Log4jConfigListener實現運行時切換需求,Log4jConfigListener對log4j原生方法進行封裝。默認情況是1分鐘重新加載一次。

在web.xml文件中 配置 加載 log4j.properties的屬性

<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>10000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 爲避免項目間衝突,定義唯一的 webAppRootKey --> <context-param> <param-name>webAppRootKey</param-name> <param-value>scheduleProject</param-value> </context-param>

①log4jConfigLocation 指定Spring從哪個目錄下加載 log4j.properties 配置文件

②log4jRefreshInterval 當修改了配置文件時,不需要重啓就能加載變化了的log4j.properties 配置文件

③webAppRootKey 項目的標識,一個窗口中可能部署了多個項目,用它進行區分。當配置日誌文件的輸出目錄時,可能會用到它。

調用setlevel()動態設置

通過界面

通過自己做的web界面,客戶在前臺設置日誌級別,後臺調用logger.setlevel()來完成日誌級別切換,但是這有個缺點,下次服務重啓後,本次的日誌級別調整持久保存下來。

實例代碼參考:log4jHotChange.jsp

通過Spring+JMX方式

如果使用spring和jmx會很簡單

實例代碼參考:Log4jHotChangeMBean

本文所有實例代碼見:https://bitbucket.org/jiangxincode/javawebtest

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