[英]Log4j FileAppender issue in Tomcat server
我正在開發一個web應用程序,我有一個需要在運行時為我的impex進程生成日志文件。這是用例我正在驗證XML文件並且驗證錯誤由自定義錯誤處理程序處理。這個錯誤hanlde將是傳遞給底層驗證器(Jaxb 2.x驗證器),因此我必須在創建此錯誤hanlder的實例時創建日志文件。 我們使用log4j作為日志API
這是在運行時創建日志文件的代碼
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行的位置有3個日志(A,B,C)文件,而C是在此過程中創建的最新文件。 所以,當我重新啟動我的服務器時(通過重新調整我的意思是我從控制台停止了tomcat)它有些如何將數據附加到previos所有日志文件中這個fashin C仍有3行B現在有6行A現在有9行
似乎我創建的appender仍然是開放的或有參考,不確定究竟發生了什么。 這方面的任何幫助都會有所幫助。
問題解決了..問題是我正在使用的appender。我的印象是log4j自己處理appender的關閉,但它沒有這樣做(我看到FileAppender代碼,因為它試圖關閉appender)。 所以我自己關閉了appender,它解決了問題。
在log.addAppender(appender);
之前log.addAppender(appender);
你可以寫log.removeAllAppenders();
需要更多信息。 當你說“重新啟動我的服務器”時,這是否意味着整個JVM重新啟動或只是JVM中的線程? 使用自定義守護程序之前我遇到了類似的問題。 當我認為服務器重新啟動時,它實際上並沒有殺死守護程序和JVM的先前實例,因此我有多個實例在運行,更新和相互沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.