天天看點

java 自帶的log_【轉載】JDK自帶的log工具

版權聲明:本文為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