差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:log4j:config_watchdog [2013/03/13 19:23]
tony
java:log4j:config_watchdog [2023/06/25 09:48] (目前版本)
行 2: 行 2:
 ====== FileWatchDog for Configuration ====== ====== FileWatchDog for Configuration ======
 ===== Problem ===== ===== Problem =====
-在軟體開發與debug的時候,為了幫助了解程式做到什麼地方、發生問題在哪或狀態如何,會使用log去記錄重要的執行過程。但每次修改完log4j property file為了讓它生效,會重新啟動應用程式讓它reload,但這樣不是很煩嗎?​為了解決這樣問題,我們可以透過Log4J提供的PropertyWatchdog去polling ​config是否有做過修改,使用也只要透過PropertyConfigurator的configureAndWatch就可以了,預設是60秒check一次。+在軟體開發與debug的時候,為了幫助了解程式做到什麼地方、發生問題在哪或狀態如何,會使用log去記錄重要的執行過程。但每次修改完log4j property file為了讓它生效,會重新啟動應用程式讓它reload,但這樣不是很煩嗎?​為了解決這樣問題,我們可以透過Log4J提供的PropertyWatchdog去polling ​property file是否有做過修改。如以下程式碼,透過PropertyConfigurator的configureAndWatch就可以了,預設是60秒check一次。
 <code java> <code java>
 org.apache.log4j.PropertyConfigurator.configureAndWatch(aLogPropertyFilePath);​ org.apache.log4j.PropertyConfigurator.configureAndWatch(aLogPropertyFilePath);​
行 19: 行 19:
 new PropertyConfigurator().doConfigure(filename,​ LogManager.getLoggerRepository()) new PropertyConfigurator().doConfigure(filename,​ LogManager.getLoggerRepository())
 </​code>​ </​code>​
-於是我直接寫了一個class去繼承Log4j既有的FileWatchdog,並於發生改變時,初始化之前做Configuration的reset,這個問題就這樣解決了。+於是我直接寫了一個class去繼承Log4j既有的FileWatchdog,並於發生改變時,重新reset configuration,這個問題就這樣解決了。
 <code java> <code java>
 public class Log4jPropertyWatcher extends FileWatchdog { public class Log4jPropertyWatcher extends FileWatchdog {
行 47: 行 47:
  }  }
 } }
-</​code>​ +</​code>​h 
-那Root Cuase呢? 錯誤訊息是由AppenderSkeleton丟出的,原因是因為它發現已經被執行過close了。close也許是關閉檔案或串流等等動作,根據Append實做決定,但重點的確被某人給關閉了。+那Root Cuase呢? 錯誤訊息是由AppenderSkeleton丟出的,原因是它發現Appender已經被close了。close也許是關閉檔案或串流等等動作,這由根據Append實做決定,但重點的確被某人給關閉了。
 <code java> <code java>
 public synchronized void doAppend(LoggingEvent event) public synchronized void doAppend(LoggingEvent event)
行 57: 行 57:
      }      }
 </​code>​ </​code>​
-於是重頭開始trace PropertyConfigurator的parseCategory,發現它會將每一個logger執行removeAllAppenders()動作。+於是重頭開始trace PropertyConfigurator,在parseCategory中發現它會透過logger的removeAllAppenders,可能原有的Appender都close掉,且它每一個Appender都是相同的instance。這會造成什麼問題?​ 因為Log4j在做config的時候,會根據你所設定的package去加入Appender。如果你移除了某些package,又或者像是Problem中增加package的child而不保留原本的。**原先的package並沒有被Log4j回收或清除**,它在執行log時,會使用原本設定在它身上Appender,跟著就死翹翹啦!\\
  
 ===== Reference ===== ===== Reference =====