最近在看日誌的一些東西,發現利用JDK自帶的log也能夠簡單的實現日誌的輸出,將日誌寫入文件的過程記錄以下:java
一、新建LogUtil.Java( 裏面寫了幾個靜態方法,爲log設置等級、添加log控制檯handler、添加log文件輸出handler)ide
package cn.darkranger.log.logger; 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; /** * JDK自帶的Log的工具類(手寫,勿噴。。) * * @author DarkRanger
* @date 20160615 * */ public class LogUtil { // 正常的日期格式 public static final String DATE_PATTERN_FULL = "yyyy-MM-dd HH:mm:ss"; // 不帶符號的日期格式,用來記錄時間戳 public static final String DATE_PATTERN_NOMARK = "yyyyMMddHHmmss"; /** * 爲log設置等級 * * @param log * @param level */ public static void setLogLevel(Logger log, Level level) { log.setLevel(level); } /** * 爲log添加控制檯handler * * @param log * 要添加handler的log * @param 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); } /** * 爲log添加文件輸出Handler * * @param log * 要添加文件輸出handler的log * @param level * log輸出等級 * @param filePath * 指定文件全路徑 */ 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); } /** * 獲取當前時間 * * @return */ public static String getCurrentDateStr(String pattern) { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.format(date); } }
二、新建LogFactory.Java(用於獲取全局log,這裏的全局log不一樣於jdk自帶log的全局log,jdk自帶的全局log須要手動添加ConsoleHandler和FileHandler,這裏只所有定義好了,只須要經過LogFactory.getGlobalLog()就能夠獲取到,使用的過程當中會自動添加日誌到對應的文件)工具
package cn.darkranger.log.logger; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; /** * Jdk再帶Logger的LoggerFactory(純手寫) * * @author DarkRanger * @date 20160615 * */ 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(); } /** * 初始化全局Logger * * @return */ 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; } }
三、寫測試類JDKLogTest.Java測試
package cn.darkranger.log.logger; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.Test; /** * JDK自帶的Log 測試 * * @author DarkRanger * */ 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!"); } }
測試結果:this
控制檯輸出:spa
六月 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!日誌
文件輸出:code
E:\Log\JDKLog\JDKLog_20160615152637.log(自定義全局log的日誌文件)orm
[ 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的日誌文件)blog
[ 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!