2012-09-05 52 views
1

我正在使用java.util.logging.Logger類登錄我的應用程序。我添加了FileHandler,以便應用程序日誌直接存儲在log.txt文件中。記錄器無法正常工作

但由於某種原因,應用程序終止後,日誌遠未完成。在cmd上,我可以看到所有的語句,但它們從不附加到文件中。

我已經設置的FileHandler到記錄儀:

private void setLogger() { 
    try { 
     FileHandler hand = new FileHandler("log/log.txt", true); 
     hand.setFormatter(new SimpleFormatter()); 
     Logger log = Logger.getLogger(ImageRename.MAIN_LOG); 
     //log.setUseParentHandlers(false); 
     log.addHandler(hand); 
     log.setLevel(Level.ALL);   
    } catch (IOException e) { 
     System.out.println("Could Not set logger"); 
    } 
} 

帶沖洗的任何問題?如何解決它?謝謝。

PS:在調試時,我注意到,在

之間

Logger.getLogger(ImageRename.MAIN_LOG).getHandlers()長度

返回0。如果它應該返回1最初它正在打印1,但在某一行它變成了零。

+0

我認爲處理日誌的最好方法之一是使用[Apache log4j](http://logging.apache.org/log4j/1.2/)。這是一個易於使用和高度可定製的Java日誌框架 – Sujay

+1

避免庫膨脹。我認爲log4j與* current * Java日誌(在Java 1.4中引入)相比幾乎沒有什麼好處。 –

+0

嘗試以最高優先級進行日誌記錄,並嘗試爲*處理程序*設置一個級別。可能您的處理程序沒有設置爲在此級別登錄。 –

回答

3

問題是...... 垃圾回收

正在發生的事情很可能是以下幾點:

  1. 你叫Logger.getLogger(ImageRename.MAIN_LOG);
  2. 您設置的記錄。
  3. Java通知它未被引用,並放棄它。
  4. 你打電話Logger.getLogger(ImageRename.MAIN_LOG);,並期望得到相同的記錄器。
  5. A 新鮮記錄儀設置爲默認配置。

您可以通過兩種措施避免這種情況:

  • 使用配置文件logging.properties進行配置。創建記錄器時,Java記錄API將查詢配置,並因此適當地重新創建它。
  • 使用靜態引用。無論如何,這是最佳做法。雖然類加載它,然後不應該被垃圾收集AFAICT

    private final static Logger LOG = 
        Logger.getLogger(ExampleClass.class.getName()); 
    

:裝備每類的記錄器。

1

參見例如http://www.massapi.com/class/fi/FileHandler.html爲例(通過谷歌找到)

注意以下行,這可能是你的問題:

fileHandler.setLevel(Level.ALL); 

(注:這是不是Logger或消息Handler的水平,)

對於調試,首先嚐試獲取記錄的ERROR級別的消息。級別爲INFO及以下的消息通常在默認情況下被抑制。

也嘗試儘快設置日誌記錄級別。根據我的經驗,配置Java記錄的最可靠的方法是通過使用屬性文件,並調用java有:

-Djava.util.logging.config.file=path/to/file/logging.properties 

的原因是,你做的設置有時是應用到記錄器之前創建一旦對日誌記錄進行了一些更改,您就會加載設置。

+0

我所有的日誌都是Info級別的。你可以請你的意思是「INFO級以下的消息通常是默認壓制的。」 – Jatin

+0

使用屬性文件配置記錄器的+1。此外,我會建議使用預定義的級別而不是「全部」。在這種情況下,設置'Level.FINE'甚至'Level.FINEST'會有幫助 – Sujay

+0

對不起,我認爲默認級別只記錄* INFO以上*,但據我所知它是開始記錄在'INFO'本身。那麼你應該看到他們。無論如何,請嘗試更高級別的日誌記錄進行調試! –