記錄層級java.util.log.Level
java中將日誌是一個比較簡單的對象,只有三個屬性,name,value,resourceBundleName,分別表示日誌的名稱,值和資源檔名稱,日誌分為了以下6個層級,這六個層級在Level中以靜態常量的方式出現(注意該類的構造方法是protected,意味著只有子類中才能使用new來構造該對象,resourceBundleName預設讀取sun.util.logging.resources.logging)
Level.OFF = new Level("OFF",Integer.MAX_VALUE,defaultBundle) --這個記錄層級比較特殊,用來關閉日誌
Level.SEVERE = new Level("SEVERE",1000,defaultBundle) --系統比較嚴重的錯誤層級,一般是無法恢複的bug
Level.WARNING = new Level("WARNING",900,defaultBundle) --警告提示
Level.INFO = new Level("INFO",800,defaultBundle) --普通訊息輸出
Level.CONFIG = new Level("CONFIG",700,defaultBundle) --靜態配置資訊輸出,如cpu,mem
Level.FINE = new Level("FINE",600,defaultBundle) --
Level.FINER = new Level("FINER",500,defaultBundle) --
Level.FINEST = new Level("FINEST",400,defaultBundle) --FINE,FINER,FINEST三個記錄層級都是用來追蹤記錄檔資訊,輸出資訊的詳細程度依次遞增
Level.ALL = new Level("ALL",Integer.MIN_VALUE,defaultBundle) --所有的日誌資訊都輸出
學習到了什麼。
1)對象常量化
系統中的記錄層級不多,將所有的對象都搞成靜態變數,只要初始化一次,任何時候都能調用了
2)防止外部程式泛濫調用new來組建記錄檔層級對象
可以看到Level類的建構函式聲明為protected類型的,就是為了讓外部調用程式直接引用靜態常量而不是用new 來產生自己的對象,同時又保留來該類的可擴充性質,子類依舊可以擴充父類的構造方法來產生對象
3)記錄層級的遞增/遞減性
可以看到一個日誌對象的名稱只是對該層級的一個文本描述,而層級的值遵循了從小到大依次遞增的規律,從Integer.MAX_VALUE到Integer.MIN_VALUE,輸出日誌資訊越來越詳細,這種設計的好處可以在程式裡通過很簡單的整數大小判斷來決定輸出哪個層級的日誌,if(level<=Level.ALL){}else if(level <=Level.FINEST){}...
4)小技巧--Level類中有個靜態方法,把一個字串轉換成一個Level對象,如傳入"INFO"返回Level.INFO,也可以傳入"400",返回Level.FINEST
public static synchronized Level parse(String name) throws IllegalArgumentException {
name.length(); //--一個檢查null 指標的另類方法
//先通過名稱檢查如傳入的是"INFO"的情況,如果找到了直接返回了
// Look for a known Level with the given non-localized name.
for (int i = 0; i < known.size(); i++) {
Level l = (Level) known.get(i);
if (name.equals(l.name)) {
return l;
}
}
//如果不是類似“INFO”這種格式的,檢查是否是如“400”這樣的
try {
int x = Integer.parseInt(name);
for (int i = 0; i < known.size(); i++) {
Level l = (Level) known.get(i);
if (l.value == x) {
return l;
}
}
// Create a new Level.
return new Level(name, x);
} catch (NumberFormatException ex) {
// Not an integer.
// Drop through.
}
//即不是如“INFO”,又不是"400"格式,檢查資源檔
for (int i = 0; i < known.size(); i++) {
Level l = (Level) known.get(i);
if (name.equals(l.getLocalizedName())) {
return l;
}
}
// 都不是報錯了
throw new IllegalArgumentException("Bad level /"" + name + "/"");
}