2011-02-12 102 views
6

我正在開發一個web應用程序,我需要在運行時爲我的impex進程生成日誌文件。這裏是用例 我正在驗證XML文件並驗證錯誤正在處理中通過自定義的錯誤處理程序。這個錯誤hanlde將被傳遞給底層的驗證器(Jaxb 2.x驗證器),所以當創建這個錯誤hanlder的實例時,我必須創建日誌文件。 我們使用log4j的日誌記錄APITomcat服務器中的Log4j FileAppender問題

這裏是代碼在運行時創建日誌文件

XMLErrorHandler<Object> errorHandler=new XMLErrorHandler<Object>(logFileLocation); 
     logFileName=errorHandler.getLogFileName(); 
     validator.setErrorHandler(errorHandler); 
      validator.validate(source); 

我創造XMLErrorHandler構造函數中的日誌文件,因爲這是唯一的一點,我有控制這裏日誌文件創建

FileAppender appender; 
      try { 
       appender = new FileAppender(layout, sb.toString(), false); 
       log.addAppender(appender); 
       log.setAdditivity(false); 
       log.setLevel(Level.WARN); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

一切的代碼工作正常並且文件被正確創建,以及由記錄到相應的地方被寫入。 但如果我重新啓動我的服務器真正的問題開始和記錄器開始將日誌內容不僅附加到其當前的日誌文件,而且還爲服務器運行時爲此過程創建的所有文件。這裏是詳細信息 讓我們假設我有3個日誌(A,B,C)文件已經在每個日誌文件中有3行的位置,C是在這個過程中創建的最新文件。 所以當我重新啓動我的服務器(通過resrarting我的意思是我停止從控制檯的tomcat)它如何將數據添加到previos所有日誌文件在此fashin C仍然有3行 B現在有6行 A現在有9行

看來,我創建的appender仍然是開放的或有參考,不知道究竟發生了什麼。 在這方面的任何幫助將是有益的。

回答

1

問題解決了。 問題出在我使用的appender上.i給人的印象是log4j自己處理appender的關閉,但它沒有這樣做(我看到FileAppender代碼,因爲它試圖關閉appender)。 所以我自己關閉了appender,它解決了這個問題。

0

需要更多信息。當你說「重啓我的服務器」時,這是否意味着整個JVM重啓或者只是JVM內的線程?我之前用自定義守護進程遇到類似這樣的問題。當我認爲服務器重新啓動時,它並沒有真正殺死守護進程和JVM的先前實例,所以我有多個實例正在運行,更新和衝突。

+0

所有我的意思是,既然事情都在發展,所以我剛剛停止我從月食服務器(Tomcat)的,比again.when啓動它我來控制我的服務器從eclipse上面的行爲發生了。我注意到,當服務器運行時,它不會追加所有文件中的內容,當我停止服務器時發生此行爲。 – 2011-02-14 14:00:34

0

log.addAppender(appender);之前,你可以通過重新啓動我的服務器寫log.removeAllAppenders();