版權聲明:本文為Jaiky_傑哥原創,轉載請注明出處。This blog is written by Jaiky, reproduced please indicate. https://blog.csdn.net/jaikydota163/article/details/52783588
關于Logger
最近放假在家無聊,研究一個開源架構時發現它頻繁運用到了一個叫Logger的相關類來進行日志記錄,作為log4j的忠實粉絲,在大多數項目上都看到的是log4j和commons-logging,這個Logger為何物?點開源碼看,才發現是JDK自帶的日志類,非第三方開源Jar包,于是便起了好奇之心,想看看這個Logger與log4j和commons-logging有何不同,翻了翻Blog,使用研究一番,此處說下我的初步體驗。
傳統的Java項目中給項目程式添加log主要有三種方式,一使用JDK中的java.util.logging包,一種是log4j,一種是commons-logging。其中log4j和commons-logging都是apache軟體基金會的開源項目。這三種方式的差別如下:
Java.util.logging:
JDK标準庫中的類,是JDK 1.4 版本之後添加的日志記錄的功能包。
log4j:
最強大的記錄日志的方式。可以通過配置 .properties 或是 .xml 的檔案, 配置日志的目的地,格式等等。
commons-logging:
最綜合和常見的日志記錄方式,是Java中的一個日志接口,一般會與log4j一起使用。自帶SimpleLog可用于日志記錄。
Java Logging API提供了七個日志級别用來控制輸出。這七個級别分别是:
級别
SEVERE WARNING INFO CONFIG FINE FINER FINEST
調用方法
severe() warning() info() config() fine() finer() finest()
含意
嚴重 警告 資訊 配置 良好 較好 最好
Logger的使用
1、建立LogUtil.Java( 裡面寫了幾個靜态方法,為log設定等級、添加log控制台handler、添加log檔案輸出handler)
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class LogUtil {
// 正常的日期格式
public static final String DATE_PATTERN_FULL = "yyyy-MM-dd HH:mm:ss";
// 不帶符号的日期格式,用來記錄時間戳
public static final String DATE_PATTERN_NOMARK = "yyyyMMddHHmmss";
public static void setLogLevel(Logger log, Level level) {
log.setLevel(level);
}
public static void addConsoleHandler(Logger log, Level level) {
// 控制台輸出的handler
ConsoleHandler consoleHandler = new ConsoleHandler();
// 設定控制台輸出的等級(如果ConsoleHandler的等級高于或者等于log的level,則按照FileHandler的level輸出到控制台,如果低于,則按照Log等級輸出)
consoleHandler.setLevel(level);
// 添加控制台的handler
log.addHandler(consoleHandler);
}
public static void addFileHandler(Logger log, Level level, String filePath) {
FileHandler fileHandler = null;
try {
fileHandler = new FileHandler(filePath);
// 設定輸出檔案的等級(如果FileHandler的等級高于或者等于log的level,則按照FileHandler的level輸出到檔案,如果低于,則按照Log等級輸出)
fileHandler.setLevel(level);
fileHandler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
// 設定檔案輸出格式
return "[ " + getCurrentDateStr(DATE_PATTERN_FULL) + " - Level:"
+ record.getLevel().getName().substring(0, 1) + " ]-" + "[" + record.getSourceClassName()
+ " -> " + record.getSourceMethodName() + "()] " + record.getMessage() + "\n";
}
});
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 添加輸出檔案handler
log.addHandler(fileHandler);
}
public static String getCurrentDateStr(String pattern) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
}
2、建立LogFactory.Java(用于擷取全局log,這裡的全局log不同于jdk自帶log的全局log,jdk自帶的全局log需要手動添加ConsoleHandler和FileHandler,這裡隻全部定義好了,隻需要通過LogFactory.getGlobalLog()就可以擷取到,使用的過程中會自動添加日志到對應的檔案)
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogFactory {
// 全局Log的名稱
public static final String LOG_NAME = "Global";
// 這個檔案路徑必須存在,不存在會報錯,并不會自動建立
public static final String LOG_FOLDER = "E:\\Log\\JDKLog";
// log檔案路徑
private static String log_filepath;
// 靜态變量globleLog
private static Logger globalLog;
static {
// 加載類的時候初始化log檔案全路徑,這裡的檔案名稱是JDKLog_+時間戳+.log
log_filepath = LOG_FOLDER + File.separator + "JDKLog_" + LogUtil.getCurrentDateStr(LogUtil.DATE_PATTERN_NOMARK)
+ ".log";
// 加載類的時候直接初始化globleLog
globalLog = initGlobalLog();
}
public static Logger initGlobalLog() {
// 擷取Log
Logger log = Logger.getLogger(LOG_NAME);
// 為log設定全局等級
log.setLevel(Level.ALL);
// 添加控制台handler
LogUtil.addConsoleHandler(log, Level.INFO);
// 添加檔案輸出handler
LogUtil.addFileHandler(log, Level.INFO, log_filepath);
// 設定不适用父類的handlers,這樣不會在控制台重複輸出資訊
log.setUseParentHandlers(false);
return log;
}
public static Logger getGlobalLog() {
return globalLog;
}
}
3、寫測試類JDKLogTest.Java
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.Test;
public class JDKLogTest {
// 自定義的全局log(個人一般用這個記錄)
private static Logger log = LogFactory.getGlobalLog();
// Jdk1.7以後自帶的全局log(後面我添加了FileHandler,用于寫入檔案日志)
private static Logger sysLog = Logger.getGlobal();
static {
//由于jdk自帶的全局log沒有寫入檔案的功能,我這裡手動添加了檔案handler
LogUtil.addFileHandler(sysLog, Level.INFO, LogFactory.LOG_FOLDER + File.separator + "sys.log");
}
@Test
public void test01() {
// 級别從上往下依次降低
log.severe("severe--> this is severe!");
log.warning("warning--> this is warning!");
log.info("info--> this is info!");
log.config("config--> this is config!");
log.fine("fine--> this is fine!");
log.finer("finer--> this is finer!");
log.finest("finest--> this is finest!");
}
@Test
public void test02() {
log.info("info--> this is test02 log");
}
@Test
public void test03() {
sysLog.info("test03 info!");
}
@Test
public void test04() {
sysLog.info("test04 info!");
}
}
測試結果:
控制台輸出:
六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test01
嚴重: severe--> this is severe!
六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test01
警告: warning--> this is warning!
六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test01
資訊: info--> this is info!
六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test02
資訊: info--> this is test02 log
六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test03
資訊: test03 info!
六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test04
資訊: test04 info!
檔案輸出:
E:\Log\JDKLog\JDKLog_20160615152637.log(自定義全局log的日志檔案)
[ 2016-06-15 15:26:37 - Level:S ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] severe--> this is severe!
[ 2016-06-15 15:26:37 - Level:W ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] warning--> this is warning!
[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] info--> this is info!
[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test02()] info--> this is test02 log
E:\Log\JDKLog\sys.log(系統自帶log全局log的日志檔案)
[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test03()] test03 info!
[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test04()] test04 info!
聲明
歡迎轉載,但請保留文章原始出處
作者:Jaiky_傑哥
出處:http://blog.csdn.net/jaikydota163/article/details/52783588