2013-07-08 129 views
0

我有一個java.util.logging的東西的問題...我無法記錄好,更好,最好的水平。Java日誌記錄(utils)probelm與級別

我已經在這裏找到理想的解決方案: StackOverflowPost

我創造我自己的類用於獲取相應的記錄器實例:

public static Logger getLogger(Level level, String name) { 
     Logger logger; 
     logger = (name != null) ? Logger.getLogger(name) : Logger.getAnonymousLogger(); 
     logger.setLevel(level); 
     ConsoleHandler handler = new ConsoleHandler(); 
     handler.setLevel(level); 
     logger.addHandler(handler); 

     return logger; 
    } 

但使用它後,我的記錄器會記錄每個水平的兩倍:

private static final Logger logger = testlogger.getLogger(Level.INFO, "testname"); 
    public static void main(String[] args) { 

     try { 
      throw new IllegalArgumentException("Uuuuu!!!"); 
     } catch (IllegalArgumentException e) { 
      logger.log(Level.SEVERE, "Something wrong"); 
      logger.log(Level.WARNING, "Something wrong"); 
      logger.log(Level.INFO, "Something wrong"); 
      logger.log(Level.CONFIG, "Something wrong"); 
      logger.log(Level.FINE, "Something wrong"); 
      logger.log(Level.FINER, "Something wrong"); 
      logger.log(Level.FINEST, "Something wrong"); 
     } 
    } 

輸出:

2013年7月8日9時37分08秒xxx.testclass主要SCHWERWIEGEND:有事嗎
2013年7月8日9時37分08秒xxx.testclass主要SCHWERWIEGEND:有事嗎
2013年7月8日9時37個08秒xxx.testclass主要WARNUNG:有事嗎
2013年7月8日9時37分08秒xxx.testclass主要WARNUNG:有事嗎
2013年7月8日9時37分08秒xxx.testclass主要信息:有事嗎
2013年7月8日09:37: 08 xxx.testclass main INFO:出錯了

我在猜測,Logge r已經添加了一些默認處理程序,所以我試過了:

for (Handler h : logger.getHandlers()) { 
      logger.removeHandler(h); 
     } 

在添加ConsoleHanlder之前,但沒有結果。

從我剛纔提到的帖子,我明白爲了顯示更好,更細,最好的級別,我必須添加ConsoleHandler。

所以我的問題是「我如何強制記錄器只使用ConsoleHandler」?

回答

0

我之前沒有使用Java Util Logging,但基於我在Log4J/SLF4J中的經驗,使用JUL的方式似乎很奇怪。

我們在每次獲取記錄器時都沒有設置處理程序和記錄器的級別。通常在應用程序運行之前它是一次性設置。因此,JUL已經正確設置了記錄器層次結構,並且您只需獲取要使用的記錄器並進行記錄。

你做這個設置的方式也會導致很大的麻煩,因爲每次你得到相同的記錄器時你都會添加一個新的ConsoleHandler。這意味着,如果您獲得10次,則從第10次獲得記錄器,每次記錄將導致10條消息顯示在屏幕上。

回到你的問題,我相信默認情況下,JULI中的根記錄器是用ConsoleHandler設置的。這意味着,你並不需要自己設置ConsoleHandler,因爲每個記錄器都會跟隨其父處理程序,而處理程序依次跟隨根記錄器的處理程序。

要麼刪除您的代碼中的ConsoleHandler設置,並按照父母的處理程序。或者您可以將記錄器的可加性更改爲false(如JUL中的logger.setUseParentHandlers(false))。

但是,我的建議是對JUL進行一些基本的瞭解並知道如何首先使用它。

+0

嘿!感謝這些提示!我的實施只是一個非常快速的演示。當然,我不想完全按照這種方式使用它。 ParentHadlers的問題正是我一直在尋找的。謝謝。 –