java.util.logging.Logger使用詳解
一、創(chuàng)建Logger對象
要使用J2SE的日志功能,首先要取得java.util.logging.Logger實(shí)例,這可以通過Logger類的兩個靜態(tài)getLogger()方法來取得:
查找或創(chuàng)建一個logger拘领。
static Logger getLogger(String name)
為指定子系統(tǒng)查找或創(chuàng)建一個logger。
static Logger getLogger(String name, String resourceBundleName)
注意:name是Logger的名稱樱调,當(dāng)名稱相同時候约素,同一個名稱的Logger只創(chuàng)建一個届良。
下面是簡單范例:
import java.util.logging.*;
public class LoggingDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger("!LoggingDemo");
try {
System.out.println(args![0]);
} catch(!ArrayIndexOutOfBoundsException e) {
logger.warning("沒有提供執(zhí)行時的自變量!");
}
}
}
執(zhí)行結(jié)果:
2009-4-7 15:41:43 pku.sei.LoggingDemo main
警告:沒有提供執(zhí)行時的自變量圣猎!
二士葫、日志級別
在進(jìn)行信息的記錄時,依信息程序的不同样漆,會設(shè)定不同等級的信息輸出为障。Java log比log4j的級別詳細(xì)晦闰,全部定義在java.util.logging.Level里面放祟。
各級別按降序排列如下:
- SEVERE(最高值) 嚴(yán)重信息
- WARNING 警示信息
- INFO 一般信息
- CONFIG 配置信息
- FINE 細(xì)微信息
- FINER 更細(xì)微的信息
- FINEST(最低值) 最細(xì)微的信息
可以通過操作Logger上的幾個方法來得到不同等級的信息輸出。如下列范例:
import java.util.logging.*;
public class LoggingLevelDemo{
public static void main(String[] args){
Logger logger = Logger.getLogger("loggingLevelDemo");
logger.severe("嚴(yán)重信息");
logger.warning("警示信息");
logger.info("一般信息");
logger.config("設(shè)定方面的信息");
logger.fine("細(xì)微的信息");
logger.finer("更細(xì)微的信息");
logger.finest("最細(xì)微的信息");
}
}
輸出:
2009-4-7 15:50:43 pku.sei.LoggingLevelDemo main
嚴(yán)重:嚴(yán)重信息
2009-4-7 15:50:43 pku.sei.LoggingLevelDemo main
警告:警示信息
2009-4-7 15:50:43 pku.sei.LoggingLevelDemo main
信息:一般信息
此示例中config()方法及以下的信息并沒有顯示出來呻右,這是因?yàn)長ogger的默認(rèn)等級是INFO跪妥,比這個等級更低的信息,Logger并不會將信息輸出声滥。
默認(rèn)等級
Logger的默認(rèn)等級是定義在執(zhí)行環(huán)境的屬性文件logging.properties中眉撵,這個文件位于JRE安裝目錄的lib目錄下。部分內(nèi)容如下:
handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = INFO
logger默認(rèn)的級別是INFO落塑,比INFO更低的日志將不顯示纽疟。
Logger的默認(rèn)級別定義是在jre安裝目錄的lib下面。
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
此外憾赁,還有一個級別OFF污朽,可用來關(guān)閉日志記錄,使用級別ALL啟用所有消息的日志記錄龙考。
三蟆肆、輸出媒介控制器:Handler
輸出媒介控制器將指定日志數(shù)據(jù)的輸出媒介:如控制臺、文件晦款、遠(yuǎn)程主機(jī)或者是網(wǎng)絡(luò)等炎功。
Logger默認(rèn)的輸出媒介控制器(Handler)是java.util.logging.ConsolerHandler,也就是將信息輸出至控制臺缓溅。一個Logger可以擁有多個handler蛇损,每個handler可以有自己的日志級別,在通過Logger的級別限制后坛怪,實(shí)際上還要再經(jīng)過handler的級別限制淤齐。所以在上面的范例中如果想要看到所有的信息,則必須同時設(shè)定Logger與ConsoleHandler的級別酝陈。下面的范例示范了如何設(shè)定:
import java.util.logging.*;
public class LoggingLevelDemo2{
public static void main(String[] args){
Logger logger = Logger.getLogger("loggingLevelDemo2");
// 顯示所有等級的信息
logger.setLevel(Level.ALL);
// 創(chuàng)建輸出媒介控制器并設(shè)定顯示所有等級的信息
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
// 為logger設(shè)定Handler為ConsoleHandler
logger.addHandler(consoleHandler);
logger.severe("嚴(yán)重信息");
logger.warning("警示信息");
logger.info("一般信息");
logger.config("設(shè)定方面的信息");
logger.fine("細(xì)微的信息");
logger.finer("更細(xì)微的信息");
logger.finest("最細(xì)微的信息");
}
}
運(yùn)行結(jié)果:
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
嚴(yán)重:嚴(yán)重信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
嚴(yán)重:嚴(yán)重信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
警告:警示信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
警告:警示信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
信息:一般信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
信息:一般信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
配置:設(shè)定方面的信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
良好:細(xì)微的信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
較好:更細(xì)微的信息
2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
最好:最細(xì)微的信息
Level.ALL表示顯示所有的信息床玻,所有這一次的執(zhí)行結(jié)果可顯示所有等級的信息。如果要關(guān)閉所有的信息沉帮,可以設(shè)定為Level.OFF锈死。
Logger的Severe(),warning(),info()等方法贫堰,實(shí)際上是個便捷的方法。也可以直接使用log()方法并指定等級來執(zhí)行相同的作用待牵,如:
logger.log(Level.SEVERE, "嚴(yán)重信息");
使用Handler
Handler對象從Logger中獲取日志信息其屏,并將這些信息導(dǎo)出。例如缨该,它可將這些信息寫入控制臺或文件中偎行,也可以將這些信息發(fā)送到網(wǎng)絡(luò)日志服務(wù)中,或?qū)⑵滢D(zhuǎn)發(fā)到操作系統(tǒng)日志中贰拿。
Logger默認(rèn)的輸出處理者是ConsoleHandler蛤袒。ConsoleHandler的輸出是使用System.err對象,而信息的默認(rèn)等級是INFO膨更,這可以在JRE安裝目錄下lib目錄的logging.properties中看到:
handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = INFO
Java SE實(shí)現(xiàn)了5個Handler:
(1) java.util.logging.ConsoleHandler 以System.err輸出日志妙真;默認(rèn)。
(2) java.util.logging.FileHandler 將信息輸出到文件荚守。
(3) java.util.logging.StreamHandle 以指定的!OutputStream實(shí)例輸出日志珍德。
(4) java.util.logging.SocketHandler 將信息通過Socket傳送至遠(yuǎn)程主機(jī)。
(5) java.util.logging.!MemoryHandler 將信息暫存在內(nèi)存中矗漾。
一個FileHandler的例子:
import java.io.IOException;
import java.util.logging.*;
public class HandlerDemo{
public static void main(String[] args){
Logger logger = Logger.getLogger("handlerDemo");
try{
FileHandler fileHandler = new FileHandler("%h/myLogger.log");
logger.addHandler(fileHandler);
logger.info("測試信息");
}catch (!SecurityException e)
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
}
執(zhí)行的結(jié)果會在命令行模式顯示信息锈候,并將結(jié)果輸出至文件中。%h表示使用者的根目錄(c:\document and settings\hexinyu目錄中)敞贡。%t可以取得系統(tǒng)的暫存目錄泵琳,%g自動為文件編號。例如可以設(shè)定為%h/myLogger%g.log嫡锌,表示將.log文件存儲在使用者根目錄中虑稼,并自動為每個文件增加編號。
fileHandler默認(rèn)的輸出格式是XML格式势木。輸出格式由java.util.logging.Formatter來控制蛛倦,下一節(jié)詳細(xì)介紹Formatter。 因此啦桌,此范例輸出的文件內(nèi)容如下:
<?xml version="1.0" encoding="GBK" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2009-04-07!T16:31:02</date>
<millis>1239093062781</millis>
<sequence>0</sequence>
<logger>handlerDemo</logger>
<level>INFO</level>
<class>pku.sei.!HandlerDemo</class>
<method>main</method>
<thread>10</thread>
<message>測試信息</message>
</record>
</log>
四溯壶、Formatter
Formatter為格式化LogRecords提供支持。
一般來說甫男,每個Handler都有關(guān)聯(lián)的Formatter且改。Formatter接受LogRecord,并將它轉(zhuǎn)換為一個字符串板驳。
默認(rèn)提供了兩種Formatter:
-
java.util.logging.SimpleFormatter:標(biāo)準(zhǔn)日志格式又跛,就是我們通常在啟動一些諸如Tomcat、JBoss之類的服務(wù)器的時候經(jīng)常能在控制臺下看到的那種形式若治,就像這樣:
2004-12-20 23:08:52 org.apache.coyote.http11.Http11Protocol init 信息: Initializing Coyote HTTP/1.1 on http-8080
java.util.logging.XMLFormatter:XML形式的日志格式慨蓝,如果為Logger添加了一個new XMLFormatter()感混,那么就會以XML形式輸出,不過更常用的是使用上面介紹的!FileHandler輸出到XML文件中礼烈。
從上一節(jié)的例子可知弧满,F(xiàn)ileHandler的默認(rèn)格式是java.util.logging.XMLFormatter,而ConsolerHandler的默認(rèn)格式是java.util.logging.SimpleFormatter此熬,可以使用Handler實(shí)例的setFormatter()方法來設(shè)定信息的輸出格式庭呜。
例如:
fileHandler.setFormatter(new SimpleFormatter());
FileHandler的Formatter設(shè)定為SimpleFormatter,則輸出的日志文件內(nèi)容就是簡單的文字信息犀忱,打開文件后會發(fā)現(xiàn)與命令行模式下看到的信息內(nèi)容相同募谎。