簡體   English   中英

Tomcat服務器中的Log4j FileAppender問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM