Logger管理日志

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)容相同募谎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峡碉,隨后出現(xiàn)的幾起案子近哟,更是在濱河造成了極大的恐慌驮审,老刑警劉巖鲫寄,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疯淫,居然都是意外死亡地来,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門熙掺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來未斑,“玉大人,你說我怎么就攤上這事币绩±啵” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵缆镣,是天一觀的道長芽突。 經(jīng)常有香客問我,道長董瞻,這世上最難降的妖魔是什么寞蚌? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮钠糊,結(jié)果婚禮上挟秤,老公的妹妹穿的比我還像新娘。我一直安慰自己抄伍,他們只是感情好艘刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著截珍,像睡著了一般攀甚。 火紅的嫁衣襯著肌膚如雪啄糙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天云稚,我揣著相機(jī)與錄音隧饼,去河邊找鬼。 笑死静陈,一個胖子當(dāng)著我的面吹牛燕雁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲸拥,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼拐格,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刑赶?” 一聲冷哼從身側(cè)響起捏浊,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撞叨,沒想到半個月后金踪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牵敷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年胡岔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枷餐。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡靶瘸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毛肋,到底是詐尸還是另有隱情怨咪,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布润匙,位于F島的核電站诗眨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趁桃。R本人自食惡果不足惜辽话,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卫病。 院中可真熱鬧油啤,春花似錦、人聲如沸蟀苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帜平。三九已至幽告,卻和暖如春梅鹦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冗锁。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工齐唆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冻河。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓箍邮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叨叙。 傳聞我的和親對象是個殘疾皇子锭弊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,865評論 2 8
  • 前言 在自動化測試實(shí)踐過程中,必不可少的就是進(jìn)行日志管理擂错,方便調(diào)試和生產(chǎn)問題追蹤味滞,python提供了logg...
    苦葉子閱讀 809評論 0 0
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計分析...
    時待吾閱讀 4,975評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理钮呀,服務(wù)發(fā)現(xiàn)剑鞍,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 好吧行楞,在我想到寫這個題目的時候攒暇,想必你就應(yīng)該知道我要說什么了吧!很簡單子房,一句話,愛對了才是青春就轧。最近的一波狗糧讓我...
    德睿作者閱讀 258評論 0 0