溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-09 20:21:42 來源:ITPUB博客 閱讀:170 作者:worldblog 欄目:編程語言
告別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操作。

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

  //MemoryHandlerTest.Java

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);

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

    } catch (IOException e) {

    }

  }

  public static void main(String args[]) {

  MemoryHandlerTest mt = new MemoryHandlerTest();

  int trigger = (int)(Math.random()*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值(windows 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

運行結果:

2003-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級消息
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女