Java日志組件1---Jdk自帶Logger(java.util.logging.Logger)


最近在看日志的一些東西,發現利用JDK自帶的log也可以簡單的實現日志的輸出,將日志寫入文件的過程記錄如下:

1、新建LogUtil.Java( 里面寫了幾個靜態方法,為log設置等級、添加log控制台handler、添加log文件輸出handler)

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); } }

 2、新建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; } }

 

3、寫測試類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!"); } }

測試結果:

控制台輸出:

六月 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!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM