歡迎和你們交流技術相關問題:
郵箱: 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自帶的動態更新配置很簡單,只要調用 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經過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 項目的標識,一個窗口中可能部署了多個項目,用它進行區分。當配置日誌文件的輸出目錄時,可能會用到它。
經過本身作的web界面,客戶在前臺設置日誌級別,後臺調用logger.setlevel()來完成日誌級別切換,可是這有個缺點,下次服務重啓後,本次的日誌級別調整持久保存下來。
實例代碼參考:log4jHotChange.jsp
若是使用spring和jmx會很簡單
實例代碼參考:Log4jHotChangeMBean