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

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

Handler在建立時使用LogManager物件的相關屬性的預設值(如Handler的Filter、Formatter、Level等物件屬性)進行初始化。

Handler物件可透過setLevel(Level.OFF)暫停工作;透過呼叫setLevel設定適當的記錄日誌訊息級別恢復工作。

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

1、  MemoryHandler Handler的子類,在中的一個迴圈緩衝區用於快取日誌記錄請求。通常MemoryHandler只簡單的把傳入的LogRecords到它的記憶體中。這種快取的開銷非常低廉,它去掉了格式化所產生的消耗。當某個觸發條件滿足時,MemoryHandler將其緩衝的資料push(釋出)到目標Handler,由後者實際的輸出。有三種觸發MemoryHandler進行push操作:a、傳入的LogRecords的級別高於MemoryHandler預先定義的push級別;b、有其他物件顯式的呼叫其push方法;c、其子類過載了log方法,逐一檢索每個傳入的LogRecords,若符合特定的標準則進行push操作。

例項:假設我們需要跟蹤一個生產環境中的一個很少出現的。在大多數場合,系統化產生大量的日誌記錄,而我們僅只關心記錄中最近的幾條,那麼我們只需要使用MemoryHandler對日誌記錄進行快取,當且僅當某個事件發生時將最近的幾條記錄從記憶體中 dump到制定的中。

  //MemoryHandlerTest.

import java.util.logging.*;

import java.io.*;

public class MemoryHandlerTest {

  FileHandler fhandler;

  Logger logger;

  MemoryHandler mhandler;

 

  MemoryHandlerTest() {

  try {

  //構造名為my.log的日誌記錄檔案

    fhandler = new FileHandler("my.log");

    int numRec = 5;

    //構造一個5個日誌記錄的MemoryHandler,

//其目標Handler為一個FileHandler

    mhandler = new MemoryHandler (fhandler, numRec, Level.OFF) ;

  //構造一個記錄器

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

   //為記錄器新增一個MemoryHandler

    logger.addHandler(mhandler);

 :namespace prefix = o ns = "urn:schemas--com::office" />

    } catch (IOException e) {

    }

  }

  public static void main(String args[]) {

  MemoryHandlerTest mt = new MemoryHandlerTest();

  int trigger = (int)(Math.ran()*100);

      for (int i=1;i<100;i++) {

      //在MemoryHandler中快取日誌記錄

  mt.logger.log(Level.INFO,"日誌記錄"+i);

  if (i==trigger) {

  //觸發事件成立,顯式呼叫MemoryHandler的

//push方法觸發目標Handler輸出日誌記錄到

//my.log檔案中

  mt.mhandler.push();

  break;

  }

  }

  }

}

    例項2

 

2、  FileHandler 檔案。

StreamHandler流處理器將日誌記錄以流的形式輸出。FileHandler、ConsoleHandler、SocketHandler為StreamHandler的子類。 ConsoleHandler將日誌記錄輸出到控制終端。前面的例項(例項2除外)都將日記記錄資料輸出到控制檯。

FileHandler將日誌記錄輸出到特定的檔案,或迴圈的幾個日誌檔案中。日誌檔案可以設定容量大小。當日志檔案達到限定的容量時將被自動清空,重頭開始寫入新的日誌記錄資料。

例:建立一個容量為1Mb的器

  int limit = 1000000; // 1 Mb

    FileHandler fh = new FileHandler("my.log", limit, 1);

 

對於迴圈的日誌檔案,每個檔案將被指定容量限制。噹噹前的日誌檔案的長度達到制定值後該檔案被關閉,新的日誌檔案被建立,舊的檔案將在檔名模板後追加序號。如此產生多個順序編號的日誌記錄檔案。

例:

try {

  // 建立一個擁有3個日誌檔案,每個容量為1Mb的檔案處理器

  String pattern = "my%g.log";

 int limit = 1000000; // 1 Mb

 int numLogFiles = 3;

 FileHandler fh = new FileHandler(pattern, limit, numLogFiles);

   …

 } catch (IOException e) {

 }

 

(四)、Level

  Level物件定義了一組日誌訊息的級別,用於控制日誌訊息的輸出。一個級別對應一個整型值。日誌訊息級別按照其整數值的大小排定優先順序。在Logger物件中設定一個級別,則大於等於該級別的日誌訊息將會被傳遞到某個Handler物件進行輸出處理。

J2SDK1.4的Java Logging中定義了以下訊息級別:

級別名稱

int值( 2000環境)

OFF

2147483647

SEVERE

1000

WARNING

900

INFO

800

CONFIG

700

FINE

500

FINER

400

FINEST

300

ALL

-2147483648

  表一

Level.OFF具有最高的級別。將Logger的Level級別設定成Level.OFF

讓我們看看訊息級別是怎樣工作的:LoggingLevelTest.java

import java.util.logging.*;

public class LoggingLevelTest {

public static void main(String args[]) {

  //使用Logger的靜態方法獲得一個匿名Logger

  Logger logger1 = Logger.getAnonymousLogger();

  //設定Logger物件記錄的最低日誌訊息級別

  logger1.setLevel(Level.FINER);

  //記錄訊息

  logger1.severe("SEVERE級訊息");

  logger1.warning("WARNING級訊息");

  logger1.config("CONFIG級訊息");

  logger1.info("INFO級訊息");

  logger1.fine("FINE級訊息");

  logger1.finer("FINER級訊息");

  logger1.finest("FINEST級訊息");

}

}

  例項3

 

執行結果:

 

-1-15 7:02:03 LoggingLevelTest main

: SEVERE級訊息

2003-1-15 7:02:04 LoggingLevelTest main

警告: WARNING級訊息

2003-1-15 7:02:04 LoggingLevelTest main

  : CONFIG級訊息

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

相關文章