2011-05-10 90 views
199

我想在我的程序中使用日誌。我聽說java.util.logging,但我不知道如何開始。使用java.util.logging的好例子

是否有任何我可以使用日誌記錄做的例子?我如何在自己的程序中使用日誌記錄?

+5

你可以從這裏開始:http://slf4j.org/manual.html – Jeremy 2011-05-10 13:14:28

+0

雖然這個問題是堆棧溢出的話題,但它對很多人來說顯然是有幫助的。是否有另一個SE網站可以提供這樣的問題? – 2017-05-25 21:21:46

回答

44

有很多例子,也有不同類型的日誌記錄。看看java.util.logging包。

示例代碼:

import java.util.logging.Logger; 

public class Main { 

    private static Logger LOGGER = Logger.getLogger("InfoLogging"); 

    public static void main(String[] args) { 
    LOGGER.info("Logging an INFO-level message"); 
    } 
} 

沒有硬編碼class name

import java.util.logging.Logger; 

public class Main { 
    private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName()); 

    public static void main(String[] args) { 
    LOGGER.info("Logging an INFO-level message"); 
    } 
} 
+10

爲什麼不把日誌名稱設置爲'Main.class.getSimpleName()'?這種方式重構工具將根據需要正確地進行更改,但它不像第二種解決方案那樣笨重。 – Pijusn 2013-03-06 08:56:35

+1

「笨重」是什麼意思,爲什麼你認爲它笨重?第二種解決方案將與所有重構工具一起工作(因爲類名是派生的)。另請參閱:http://stackoverflow.com/a/5271343/59087 – 2013-03-12 03:34:01

+3

爲記錄器名稱執行堆棧跟蹤是破解,緩慢和非正統的。它也會打破AOP代理或其他異常編碼的怪異名稱。 – 2013-08-04 01:45:11

1

我會建議你使用Apache的公共記錄工具。它具有高度的可擴展性,並支持不同記錄器的單獨日誌文件。 See here

+9

好的建議!儘管如此,儘量回答他們的問題,否則只是留下評論;) – Ordiel 2014-11-30 19:08:39

21

SLF4J是比Apache Commons Logging(ACL)更好的測井外觀。它與其他日誌框架建立了橋樑,通過SLF4J直接調用ACL,Log4J或Java Util日誌記錄,以便您可以根據需要將所有輸出定向到一個日誌文件,只需一個日誌配置文件。爲什麼你的應用程序會使用多個日誌框架?由於您使用的第三方庫,特別是較舊的庫,可能會這樣做。

SLF4J支持各種日誌記錄實現。它可以將所有內容輸出到標準輸出,使用Log4J或Logback(推薦使用Log4J)。

http://www.slf4j.org/

http://logback.qos.ch/

10

我會用minlog,個人。這非常簡單,因爲日誌記錄類是幾百行代碼。如果你重構它遵循你的類名

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName()); 

這樣:

+2

對於最小的佔地面積,這是圖書館的選擇。 – h3xStream 2014-09-12 03:17:33

57

應申報記錄器這樣的。

我寫了一篇關於java記錄器的文章,內容是examples here

250

java.util.logging讓您無需再攜帶一個jar文件與您的應用程序,並且它可以很好地與格式化程序配合使用。

一般來說,在每堂課的頂部,你應該有:

private static final Logger LOGGER = Logger.getLogger(ClassName.class.getName()); 

然後,您可以只使用Logger類的各種設施。


使用Level.FINE這通常就是調試在執行流程的頂層:

LOGGER.log(Level.FINE, "processing {0} entries in loop", list.size()); 

使用Level.FINER/Level.FINEST循環的內部和地方,你可能不調試基本流程問題時總是需要詳細瞭解:

LOGGER.log(Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) }); 

使用日誌記錄工具的參數化版本來防止產生噸GC需要跟蹤的字符串串聯垃圾。如上所述的Object[]便宜,通常在堆棧分配上。


有了異常處理,隨時登錄完整的異常詳細信息:

try { 
    ...something that can throw an ignorable exception 
} catch(Exception ex) { 
    LOGGER.log(Level.SEVERE, ex.toString(), ex); 
} 

我總是傳遞ex.toString()這裏的消息,因爲當我「grep -n」爲「Exception」在日誌文件中,我也可以看到消息。否則,它將位於堆棧轉儲生成的下一行輸出中,並且您必須具有更高級的RegEx才能與該行匹配,這往往會讓您獲得比您需要查看更多的輸出。

+1

這是寫入某種文件嗎?我無法在我的程序中使用它。我有你的第一行,但目前爲止沒有任何工作。 – 2014-05-12 13:12:52

+4

如何查看日誌?我正在使用的庫初始化Logger對象並使用'.fine()'方法進行日誌記錄,但似乎無法顯示消息... – 2015-02-04 08:47:58

+5

自1998年以來,我一直使用Java進行編程。發現使用Java進行日誌記錄比其需要更令人頭疼。 這是迄今爲止最直接的解釋如何登錄我讀過的Java。簡潔。 – 2015-02-17 05:38:05