java.util.logging日誌功能使用快速入門

java.util.logging在國內的項目很少使用,但是引用的很多國外開源項目會使用,比如Restlet。

 

轉載:http://blog.csdn.net/dl88250/archive/2007/10/25/1843813.aspx

 

Java Logging API是sun公司於2002年5月正式發佈的。它是自J2SE 1.4版本開始提供的一個新的應用程序接口。它能夠很方便地控制和輸出日誌信息到文件,控制檯或其它用戶定義的地方,如數據庫,電子郵件等。所以它是爲最 終用戶,系統管理員,軟件服務工程師和開發人員提供的一種捕捉安全漏洞,檢查配置正確性,跟蹤調查系統運行瓶頸和調查系統運行錯誤的工具。
Java Logging API的設計目標是要:
1. 能夠在運行時啓動或關閉日誌功能;
2. 能夠非常精密地控制日誌,即能夠啓動或關閉日誌的某個個別功能;
3. 能夠在運行時註冊日誌服務,當然也可以註冊新的第三方日誌服務;
4. 能夠提供連接服務,使Java Logging API能與現存的日誌系統(如操作系統的日誌功能)連接;
5. 能夠支持顯示高優先度的信息給最終用戶。

輸出日誌
由於Java Logging API提供了非常方便的接口,你可以在下面的例子裏看到它的使用有多方便。
例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package jdk14logger;
import java.util.logging.Logger; // <= (1)
public class HelloLogWorld
{
 
 private static String name = HelloLogWorld.class.getName();
 private static Logger log = Logger.getLogger(name);// <= (2)
 
 public void sub()
 {
  log.info("Hello Logging World");// <= (3)
 }
 
 public static void main(String[] args)
 {
  HelloLogWorld logWorld = new HelloLogWorld();
  logWorld.sub();
 }
} 

說明:
1. Logger是Java Logging API中的一個類。在此之前,你必須確認你所使用的J2SE是1.4或更高版本。
2. Logger.getLogger方法創建了一個Logger實例。每一個Logger實例都必須有個名稱,通常的做法是使用類名稱定義Logger實例。後面還會講到這樣做的原因。
3. log.info方法用來輸出日誌信息。
執行例1你可以看到控制檯上輸出了日期時間,類名,方法名和Hello Logging World的信息。

輸出的種類
Java Logging API提供了七個級別用來控制輸出。這七個級別分別是:
SEVERE (最高級別)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (最低級別)
與之對應,在Logger類中也爲你預備好了這七個級別的輸出方法。下面是使用這幾種方法輸出日誌信息的例子。
例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package jdk14logger;
import java.util.logging.Logger;
 
public class LevelTest
{
 
 private static String name = HelloLogWorld.class.getName();
 private static Logger log = Logger.getLogger(name);
 
 public void sub()
 {
  log.severe("severe level");// <= (1)
  log.warning("warning level");// <= (2)
  log.info("info level");// <= (3)
  log.config("config level");// <= (4)
  log.fine("fine level");// <= (5)
  log.finer("finer level");// <= (6)
  log.finest("finest level");// <= (7)
 }
 
 public static void main(String[] args)
 {
  LevelTest test = new LevelTest();
  test.sub();
 }
} 


執行例2你可能看到控制檯上只輸出了(1)-(3)的信息,(4)-(7)的信息並沒有如想象的那樣被輸出。這不要緊,繼續看下面的內容你就知道原因了。

控制輸出
上面例2中info以下的級別信息沒有被輸出是因爲缺省日誌輸出級別的設置是info,也就是說只有info或它以上的級別被輸出,它以下的級別不被輸 出。通過變更設置可以使輸出級別改變。變更輸出級別的方法有兩種,一是使用外部配置文件,二是使用程序編碼。通常都是使用第一種方法。缺省的外部配置文件 是JRE中lib/logging.properties文件。你可以打開這個文件,修改以下兩行爲:
.level= ALL
java.util.logging.ConsoleHandler.level = ALL
修改完後,再運行一次例2,這次(1)-(7)的內容就都輸出出來了。你可以修改輸出級別爲以下任何值,試一試輸出有什麼變化。
OFF
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
ALL

自定義的配置文件
如果你不想使用系統提供的缺省配置文件lib/logging.properties,那麼也可以使用自己定義的配置文件。使用自定義配置文件的方法有很 多種,比較方便的方法是通過定義系統屬性值java.util.logging.config.file來設置自定義配置文件。例如在執行例2時,使用下 面的命令:
java -Djava.util.logging.config.file=mylogging.properties LevelTest
其中mylogging.properties是你自定義的配置文件。如果需要,你還可以加上文件的路徑名。

更多的輸出控制
除了前面講到的七個輸出級別外,Logger類中還提供了以下三個便於程序員調試時使用的輸出信息方法:
entering
exiting
throwing
它們是與FINER相同級別的輸出,分別用於程序入口,出口和例外時的輸出。除此之外Logger類中還準備了一些輸出信息的方法,這些留待以後詳細介紹。

輸出內容的本地化
Java Logging API已經考慮到了國際化對應問題。在輸出信息上你可以使用ResourceBundle提供本地化的輸出信息。下面舉個例子說明。
例3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package jdk14logger;
import java.util.logging.Logger;
   public class LocalTest {
       private static String name = HelloLogWorld.class.getName();
       private static Logger log = Logger.getLogger (name, "jdk14logger/LocalTest");<= (1)
       public void sub() {
          log.severe("level.severe");<= (2)
          log.warning("level.warning");<= (3)
          log.info("level.info");<= (4)
          log.config("level.config");<= (5)
          log.fine("level.fine");<= (6)
          log.finer("level.finer");<= (7)
          log.finest("level.finest");<= (8)
      }
      public static void main(String[] args) {
          LocalTest test = new LocalTest();
          test.sub();
      }
} 

你可以比較一下例2和例3。可以看到例3的Logger.getLogger 方法調用中增加了一個傳參,並且(2)-(8)中的輸出內容也改變了。(1)中增加的字符串傳參就是使用ResourceBundle配置時的屬性文件 名。下面就需要建立這個屬性文件jdk14logger/LocalTest.properties,內容如下:
level.severe=severe level
level.warning=warning level
level.info=info level
level.config=config level
level.fine=fine level
level.finer=finer level
level.finest=finest level
現在運行例3可以看到輸出結果並不是(2)-(8)中定義的內容。或許你已經想到了,(2)-(8)中定義的實際上是local.properties文 件中的屬性鍵名,而輸出是這些屬性鍵名所對應的鍵值。那麼或許你要問如果屬性鍵名在屬性文件中不存在怎麼辦,答案很簡單,如果它不是屬性鍵名就一定是要輸 出的內容,所以就照原樣輸出了事。 
發佈了30 篇原創文章 · 獲贊 0 · 訪問量 839
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章