Java util Logger是java原生的日志生成工具,不需要另外引用類庫(kù),使用方便,學(xué)習(xí)簡(jiǎn)單,能夠在小型應(yīng)用中靈活使用。下面從實(shí)際應(yīng)用角度,對(duì)Logger的使用步驟作出總結(jié),以實(shí)現(xiàn)快速掌握。
Logger的使用一般包括以下幾個(gè)步驟:
一、 定義全局的Logger,在不同的類中共用
關(guān)鍵語(yǔ)句:
Logger myLogger = Logger.getLogger("com.mycompany.myapp");
方法參數(shù)是Logger的名稱,當(dāng)名稱相同時(shí)候,同一個(gè)名稱的Logger只創(chuàng)建一個(gè),實(shí)現(xiàn)各個(gè)類中共享。
二、 設(shè)定輸出媒介控制器(Handler)
共有四步:
- 一般日志輸出包括調(diào)試時(shí)輸出到控制臺(tái),以及程序運(yùn)行時(shí)輸出到文件,因此Handler包括了控制臺(tái)ConsoleHandler以及文件FileHandler。
- Handler輸出的日志格式為默認(rèn)格式,系統(tǒng)提供的格式包括SimpleFormatter、XMLFormatter等,輸出的內(nèi)容一般比較冗余,不滿足使用,最好使用自定義內(nèi)容輸出格式,可使用派生自Formatter類的自定義子類。
- 設(shè)定Handler的輸出等級(jí),默認(rèn)是info級(jí)。
- 將Handler加入到Logger中。
關(guān)鍵語(yǔ)句:
//創(chuàng)建consoleHandler 自定義類實(shí)例,用于在控制臺(tái)發(fā)送日志
ConsoleHandler consoleHandler = new ConsoleHandler();
//設(shè)置consoleHandler實(shí)例輸出格式
consoleHandler.setFormatter(new ConsoleLogFormatter());
//加入到Logger中
myLogger.addHandler(consoleHandler);
//不顯示系統(tǒng)自帶的consoleHandler,否則控制臺(tái)將發(fā)出兩條同樣的日志
myLogger.setUseParentHandlers(false);
//在工程目錄下創(chuàng)建log文件夾
File dir = new File("log");
if(!dir.exists() || !dir.isDirectory())
dir.mkdir();
//創(chuàng)建fileHandler 自定義類實(shí)例,用于在文件保存日志
FileHandler fileHandler = new
FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
fileHandler.setFormatter(new FileLogFormatter());
fileHandler.setLevel(Level.INFO);
myLogger.addHandler(fileHandler);
說(shuō)明 :
- 創(chuàng)建日志文件前,若沒(méi)有文件夾,log將會(huì)報(bào)錯(cuò),因此在寫入日志文件前,檢查文件夾是否存在,不存在則創(chuàng)建文件夾。
- FileHandler fileHandler = new FileHandler("log\myapp.%u.%g.txt",1000,2,true);
語(yǔ)句意義為:新建FileHandler,地址為工程文件路徑下;log\myapp.%u.%g.txt,循環(huán)文件編號(hào)為%u.%g,文件最大1000字節(jié),2個(gè)文件循環(huán),是否追加文件為“是”,否則總為新建文件。 - myLogger.setUseParentHandlers(false);
語(yǔ)句意義為:系統(tǒng)自帶的consoleHandler設(shè)置為不生效,僅生效增加的自定義consoleHandler,否則控制臺(tái)將發(fā)出兩條同樣的日志。
三、 Logger設(shè)置輸出等級(jí),并輸出日志
關(guān)鍵語(yǔ)句:
myLogger.setLevel(Level.INFO);
myLogger.info("一般信息1 ");
myLogger.info("一般信息2 ");
完整的程序代碼為:
public class LogProduce {
public static void main(String[] args) throws IOException {
Logger myLogger = Logger.getLogger("com.mycompany.myapp");
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(new ConsoleLogFormatter());
myLogger.addHandler(consoleHandler);
myLogger.setUseParentHandlers(false);
File dir = new File("log");
if(!dir.exists() || !dir.isDirectory())
dir.mkdir();
FileHandler fileHandler = new FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
fileHandler.setFormatter(new FileLogFormatter());
fileHandler.setLevel(Level.INFO);
myLogger.addHandler(fileHandler);
myLogger.setLevel(Level.INFO);
myLogger.info("一般信息1 ");
myLogger.info("一般信息2 ");
LogUser logUser1 = new LogUser();
logUser1.produceLog();
}
}
實(shí)際輸出為;
Console輸出:

未命名圖片.jpg
文件輸出:

image.png
四、補(bǔ)充說(shuō)明
- ConsoleLogFormatter 和 FileLogFormatter 兩個(gè)派生的 Formatter 子類
public class FileLogFormatter extends Formatter {
public FileLogFormatter(){
super();
}
@Override
public String format(LogRecord r) {
Date date = new Date();
String sDate = date.toString();
String lineSperator = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder();
sb.append("[" + sDate + "]" + "[" + r.getLevel() +"]");
sb.append(r.getMessage());
//在一條日志結(jié)束后采用常量方式的系統(tǒng)換行符,因?yàn)?“\n” 形式可能不識(shí)別
sb.append(lineSperator);
return sb.toString();
}
}
該子類重寫了format方法,用于用戶自定義輸出,使用StringBuilder類拼裝。
關(guān)鍵語(yǔ)句:
String lineSperator = System.getProperty("line.separator");
若直接在格式字符串中插入傳統(tǒng)換行符“\n",在輸出文件中可能不能識(shí)別,因此采用系統(tǒng)定義的換行符 line.separator。
類似的,ConsoleLogFormatter代碼為:
public class ConsoleLogFormatter extends Formatter {
public ConsoleLogFormatter(){
super();
}
@Override
public String format(LogRecord r) {
String lineSperator = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder();
sb.append(r.getMessage());
sb.append(lineSperator);
return sb.toString();
}
}
- 子類中調(diào)用Logger
在子類中調(diào)用getLogger即可。
public class LogUser {
Logger myLogger = Logger.getLogger("com.mycompany.myapp");
public void produceLog(){
myLogger.info("LogUser.produceLog");
}