摘自http://blog.csdn.net/dl88250/archive/2007/10/25/1843813.aspx
Java Logging API是sun公司于2002年5月正式發(fā)布的。它是自J2SE 1.4版本開始提供的一個新的應(yīng)用程序接口。它能夠很方便地控制和輸出日志信息到文件,控制臺或其它用戶定義的地方,如數(shù)據(jù)庫,電子郵件等。所以它是為最 終用戶,系統(tǒng)管理員,軟件服務(wù)工程師和開發(fā)人員提供的一種捕捉安全漏洞,檢查配置正確性,跟蹤調(diào)查系統(tǒng)運行瓶頸和調(diào)查系統(tǒng)運行錯誤的工具。
Java Logging API的設(shè)計目標(biāo)是要:
1. 能夠在運行時啟動或關(guān)閉日志功能;
2. 能夠非常精密地控制日志,即能夠啟動或關(guān)閉日志的某個個別功能;
3. 能夠在運行時注冊日志服務(wù),當(dāng)然也可以注冊新的第三方日志服務(wù);
4. 能夠提供連接服務(wù),使Java Logging API能與現(xiàn)存的日志系統(tǒng)(如操作系統(tǒng)的日志功能)連接;
5. 能夠支持顯示高優(yōu)先度的信息給最終用戶。
輸出日志
由于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中的一個類。在此之前,你必須確認(rèn)你所使用的J2SE是1.4或更高版本。
2. Logger.getLogger方法創(chuàng)建了一個Logger實例。每一個Logger實例都必須有個名稱,通常的做法是使用類名稱定義Logger實例。后面還會講到這樣做的原因。
3. log.info方法用來輸出日志信息。
執(zhí)行例1你可以看到控制臺上輸出了日期時間,類名,方法名和Hello Logging World的信息。
輸出的種類
Java Logging API提供了七個級別用來控制輸出。這七個級別分別是:
SEVERE (最高級別)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (最低級別)
與之對應(yīng),在Logger類中也為你預(yù)備好了這七個級別的輸出方法。下面是使用這幾種方法輸出日志信息的例子。
例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();
}
}
|
執(zhí)行例2你可能看到控制臺上只輸出了(1)-(3)的信息,(4)-(7)的信息并沒有如想象的那樣被輸出。這不要緊,繼續(xù)看下面的內(nèi)容你就知道原因了。
控制輸出
上面例2中info以下的級別信息沒有被輸出是因為缺省日志輸出級別的設(shè)置是info,也就是說只有info或它以上的級別被輸出,它以下的級別不被輸 出。通過變更設(shè)置可以使輸出級別改變。變更輸出級別的方法有兩種,一是使用外部配置文件,二是使用程序編碼。通常都是使用第一種方法。缺省的外部配置文件 是JRE中l(wèi)ib/logging.properties文件。你可以打開這個文件,修改以下兩行為:
.level= ALL
java.util.logging.ConsoleHandler.level = ALL
修改完后,再運行一次例2,這次(1)-(7)的內(nèi)容就都輸出出來了。你可以修改輸出級別為以下任何值,試一試輸出有什么變化。
OFF
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
ALL
自定義的配置文件
如果你不想使用系統(tǒng)提供的缺省配置文件lib/logging.properties,那么也可以使用自己定義的配置文件。使用自定義配置文件的方法有很 多種,比較方便的方法是通過定義系統(tǒng)屬性值java.util.logging.config.file來設(shè)置自定義配置文件。例如在執(zhí)行例2時,使用下 面的命令:
java -Djava.util.logging.config.file=mylogging.properties LevelTest
其中mylogging.properties是你自定義的配置文件。如果需要,你還可以加上文件的路徑名。
更多的輸出控制
除了前面講到的七個輸出級別外,Logger類中還提供了以下三個便于程序員調(diào)試時使用的輸出信息方法:
entering
exiting
throwing
它們是與FINER相同級別的輸出,分別用于程序入口,出口和例外時的輸出。除此之外Logger類中還準(zhǔn)備了一些輸出信息的方法,這些留待以后詳細(xì)介紹。
輸出內(nèi)容的本地化
Java Logging API已經(jīng)考慮到了國際化對應(yīng)問題。在輸出信息上你可以使用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 方法調(diào)用中增加了一個傳參,并且(2)-(8)中的輸出內(nèi)容也改變了。(1)中增加的字符串傳參就是使用ResourceBundle配置時的屬性文件 名。下面就需要建立這個屬性文件jdk14logger/LocalTest.properties,內(nèi)容如下:
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
現(xiàn)在運行例3可以看到輸出結(jié)果并不是(2)-(8)中定義的內(nèi)容。或許你已經(jīng)想到了,(2)-(8)中定義的實際上是local.properties文 件中的屬性鍵名,而輸出是這些屬性鍵名所對應(yīng)的鍵值。那么或許你要問如果屬性鍵名在屬性文件中不存在怎么辦,答案很簡單,如果它不是屬性鍵名就一定是要輸 出的內(nèi)容,所以就照原樣輸出了事。