告別System.out.print()—J2SDK1.4新增Java日誌框架(三) (轉)

worldblog發表於2007-12-13
告別System.out.print()—J2SDK1.4新增Java日誌框架(三) (轉)[@more@]

-1-15 7:02:04 LoggingLevelTest main:namespace prefix = o ns = "urn:schemas--com::office" />

資訊: INFO級訊息

 

可以看出,優先順序低於INFO的日誌訊息不被記錄。

Level的構造為protected便於員開發自己的訊息級別類。

 

import .util.logging.*;

//自定義訊息級別

class myLevel extends Level{

//定義自己的訊息級別SYSE

public static final Level SYSE = new myLevel("SYSE", Level.SEVERE.intValue()+10);

  public myLevel(String ln,int v) {

    super(ln,v);

  }

}

public class MyLevelTest {

public static void main(String args[]) {

  Logger logger1 = Logger.getAnonymousLogger(); 

  //設定訊息級別

  logger1.setLevel(myLevel.SYSE);

  //記錄訊息

  logger1.log(myLevel.SYSE,"SYSE訊息");

  logger1.severe("SVERE訊息");

}

    例項4

 

執行結果:

 

2003-1-15 15:40:04 MyLevelTest main

SYSE: SYSE訊息

 

只有SYSE訊息被記錄,SVERE訊息不被記錄,因為自定義級別SYSE高於SEVERE.

  (五)Formatter

Formatter負責對LogRecords進行格式化。每個記錄Handler同一個Formatter相關聯。Formatter物件接收從Handler傳來的LogRecord,將其格式化成字串後返回給Handler進行輸出。

Formatter是一個抽象類。在J2SDK1.4中,其子類及它們之間的關係見圖二。

自定義擴充套件Formatter類。例項:MyFormatterTest.java

 

import java.util.Date;

import java.util.logging.*;

 

//建立每條日誌記錄以行的日誌格式:

//時間訊息級別訊息ID日誌資訊內容

class MyFormatter extends Formatter {

 

  public String format(LogRecord rec) {

  StringBuffer buf = new StringBuffer(1000);

  buf.append(new Date().toLocaleString()); //時間

  buf.append(' ');

  buf.append(rec.getLevel()); //訊息級別

  buf.append(' ');

  buf.append(rec.getMillis()); //作為訊息ID

  buf.append(' ');

  buf.append(formatMessage(rec));//格式化日誌記錄資料

  buf.append('n');  //換行

  return buf.toString();

  } 

}

 

public class MyFormatterTest {

  public static void main(String args[]){

  //建立記錄器

Logger log1 = Logger.getLogger("MyLogger");

  //建立記錄處理器

Handler mh = new ConsoleHandler();

//為記錄處理器設定Formatter

  mh.setFormatter(new MyFormatter());

  //為記錄器新增記錄處理器

log1.addHandler(mh);

//禁止訊息處理將日誌訊息給父級處理器

  log1.setUseParentHandlers(false);

  //記錄訊息

  log1.severe("訊息1");

  log1.warning("訊息2");

  log1.info("訊息3");

  log1.config("訊息4");

  }

}

  例項5

程式執行結果:

 

2003-1-15 16:59:38 SEVERE 1042621178968 訊息1

2003-1-15 16:59:40 WARNING 1042621178985 訊息2

2003-1-15 16:59:41 INFO 1042621179105 訊息3

 

三、

  J2SDK1.4的Java Logging的配置檔案():

%J2SDK1.4_HOME%//lig/logging.properties

  從配置檔案可以看到:

(一) 自定義日誌配置檔案:

java -Djava.util.logging.config.file=myfile

  (二)全域性Handler在Java VM啟動時被載入。

(二) 全域性Handler預設為java.util.logging.ConsoleHandler。

handlers= java.util.logging.ConsoleHandler

所以我們的任何日誌記錄動作都會在控制檯進行顯示。

(三) 預設的訊息記錄級別為:INFO

.level= INFO 

在預設情況下我們在控制檯看不見低於INFO級別的日誌訊息。

(四) 預設的Handler訊息格式為java.util.logging.SimpleFormatter

 

四、日誌框架在程式測試中的應用

  Logger類提供了兩個的方法:Logger.entering() ogger.exiting() 。這對我們自己的方法提供了便利的方式。

  例子:

  記錄方法呼叫的輸入引數和輸出引數 方法myMethod將一個int 追加在一個物件之後。

執行該程式應將logging.properties的

java.util.logging.ConsoleHandler.level = INFO

改為:

java.util.logging.ConsoleHandler.level = ALL

 

import java.util.logging.*;

public class MyClass {

  public String myMethod(int p1, p2) {

  Logger logger = Logger.getLogger("com.mycompany.MyClass");

  if (logger.isLoggable(Level.FINER)) {

  logger.entering(this.getClass().getName(), "myMethod",

  new Object[]{new Integer(p1), p2});

  }

  String tmp = p2.toString() + p1;

 

  if (logger.isLoggable(Level.FINER)) {

  logger.exiting(this.getClass().getName(), "myMethod", tmp);

  }

  return tmp;

  }

 

  public static void main(String args[]) {

    MyClass mc = new MyClass();

    String rslt = mc.myMethod(123,"Hello");

   

  }

}

 

後記

  J2SDK1.4引入的日誌記錄框架為構建簡易的日誌記錄提供了便利的解決方案。雖然還有期它的一些專用日誌包如Log4j,但從簡單的列印輸出到嚴密的、可擴充套件的日誌記錄框架,J2SDK1.4的日誌系統已經足以滿足一般的系統開發的要求。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992917/,如需轉載,請註明出處,否則將追究法律責任。

相關文章