Java.util.logging:JDK標(biāo)準(zhǔn)庫(kù)中的類(lèi)拒课,是JDK 1.4 版本之后添加的日志記錄的功能包渡紫。
Java Logging API提供了七個(gè)日志級(jí)別用來(lái)控制輸出岛琼。
級(jí)別 | 調(diào)用方法 | 含義 |
---|---|---|
SEVERE | severe() | 嚴(yán)重 |
WARNING | warning() | 警告 |
INFO | info() | 信息 |
CONFIG | config() | 配置 |
FINE | fine() | 良好 |
FINER | finer() | 較好 |
FINEST | finest() | 最好 |
相關(guān)術(shù)語(yǔ)
1. logger
- 代碼需要輸入日志的地方都會(huì)用到Logger视卢,這幾乎是一個(gè)JDK logging模塊的代言人雏逾,我們常常用Logger.getLogger("com.aaa.bbb");獲得一個(gè)logger嘉裤,然后使用logger做日志的輸出。
- logger其實(shí)只是一個(gè)邏輯管理單元栖博,其多數(shù)操作都只是作為一個(gè)中繼者傳遞別的角色屑宠,比如說(shuō):Logger.getLogger(“xxx”)的調(diào)用將會(huì)依賴于LogManager類(lèi),使用logger輸入日志信息的時(shí)候會(huì)調(diào)用logger中的所有handler進(jìn)行日志的輸入仇让。
- logger是有層次關(guān)系的典奉,每個(gè)logger通常以java包名為其名稱。子logger通常會(huì)從父logger繼承l(wèi)ogger級(jí)別丧叽、handler卫玖、Resource等。
整個(gè)JVM會(huì)存在一個(gè)名稱為空的root logger踊淳,所有匿名的logger都會(huì)把root logger作為其父假瞬。
LogManager
- 整個(gè)JVM內(nèi)部所有l(wèi)ogger的管理,logger的生成、獲取等操作都依賴于它笨触,也包括配置文件的讀取懦傍。LogManager中會(huì)有一個(gè)Hashtable[
private Hashtable<String,WeakReference<Logger>> loggers
]用于存儲(chǔ)目前所有的logger,如果需要獲取logger的時(shí)候芦劣,Hashtable已經(jīng)有存在logger的話就直接返回Hashtable中的粗俱,如果hashtable中沒(méi)有l(wèi)ogger,則新建一個(gè)同時(shí)放入Hashtable進(jìn)行保存虚吟。
2. Handler
- 用來(lái)控制日志輸出的寸认,比如JDK自帶的ConsoleHanlder把輸出流重定向到System.err輸出,每次調(diào)用Logger的方法進(jìn)行輸出時(shí)都會(huì)調(diào)用Handler的publish方法串慰,每個(gè)logger有多個(gè)handler偏塞。我們可以利用handler來(lái)把日志輸入到不同的地方(比如文件系統(tǒng)或者是遠(yuǎn)程Socket連接).
3. Formatter
- 日志在真正輸出前需要進(jìn)行一定的格式化:比如是否輸出時(shí)間?時(shí)間的格式邦鲫?是否輸入線程名灸叼?是否使用國(guó)際化信息等。
4. Log Level
- JDK Logging把日志分為如下幾個(gè)級(jí)別庆捺,等級(jí)依次升高古今。all→finest→finer→fine→config→info→warning→server→off,如果將級(jí)別設(shè)為info滔以,那么info之前的低級(jí)別信息將不會(huì)輸出捉腥,只有info級(jí)別只有的信息會(huì)輸出,通過(guò)控制級(jí)別達(dá)到控制輸出的目的你画。需要注意抵碟,不僅是logger具有級(jí)別,handler也是有級(jí)別坏匪,也就是說(shuō)如果某個(gè)logger級(jí)別是FINE拟逮,客戶希望輸入FINE級(jí)別的日志,如果此時(shí)logger對(duì)應(yīng)的handler級(jí)別為INFO剥槐,那么FINE級(jí)別日志仍然是不能輸出的唱歧。
對(duì)應(yīng)關(guān)系
- LogManager與logger是1對(duì)多關(guān)系宪摧,整個(gè)JVM運(yùn)行時(shí)只有一個(gè)LogManager粒竖,且所有的logger均在LogManager中。
- logger與handler是多對(duì)多關(guān)系几于,logger在進(jìn)行日志輸出的時(shí)候會(huì)調(diào)用所有的hanlder進(jìn)行日志的處理蕊苗。
- handler與formatter是一對(duì)一關(guān)系,一個(gè)handler有一個(gè)formatter進(jìn)行日志的格式化處理沿彭。
- 很明顯:logger與level是一對(duì)一關(guān)系朽砰,hanlder與level也是一對(duì)一關(guān)系 。
簡(jiǎn)單使用
public class LogJDKTest{
public static Logger log = Logger.getLogger(LogJDKTest.class.getName());
public static void main(String[] args){
// all→finest→finer→fine→config→info→warning→server→off
// 級(jí)別依次升高,后面的日志級(jí)別會(huì)屏蔽之前的級(jí)別
log.setLevel(Level.INFO);
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
}
}
public class LogJDKTest{
public static Logger log = Logger.getLogger(LogJDKTest.class.toString());
static{
// new一個(gè)控制臺(tái)處理器
Handler console = new ConsoleHandler();
// 給處理器設(shè)置級(jí)別
console.setLevel(Level.SEVERE);
// 給logger設(shè)置處理器
log.addHandler(console);
}
public static void main(String[] args){
log.setLevel(Level.INFO);
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
}
}