熱切換Log4j級別配置

歡迎和你們交流技術相關問題:
郵箱: jiangxinnju@163.com
博客園地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnjujava

 

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

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

定時刷新log4j配置文件

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

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

實例代碼參考:Log4jHotChangeWatchdogspring

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

咱們能夠經過configureAndWatch方法來進行動態的改變log4j的配置,可是他採用了輪詢方式來實現的,如今咱們須要某種觸發機制本身調用PropertyConfigurator對象的configure(String configFilename)方法從新加載log4j的配置。觸發機制須要聯繫實際業務,若是是一個web應用,就經過頁面來調用。若是是WebService應用,就使用開發的服務來調用。jsp

實例代碼參考: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

相關文章
相關標籤/搜索