java logutil_Java日志组件1---Jdk自带Logger(java.util.logging.Logger)

最近在看日志的一些东西,发现利用JDK自带的log也可以简单的实现日志的输出,将日志写入文件的过程记录如下:

1、新建LogUtil.Java( 里面写了几个静态方法,为log设置等级、添加log控制台handler、添加log文件输出handler)

packagecn.darkranger.log.logger;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.logging.ConsoleHandler;importjava.util.logging.FileHandler;importjava.util.logging.Formatter;importjava.util.logging.Level;importjava.util.logging.LogRecord;importjava.util.logging.Logger;/*** JDK自带的Log的工具类(手写,勿喷。。)

*

*@authorDarkRanger

* @date 20160615

**/

public classLogUtil {//正常的日期格式

public static final String DATE_PATTERN_FULL = "yyyy-MM-dd HH:mm:ss";//不带符号的日期格式,用来记录时间戳

public static final String DATE_PATTERN_NOMARK = "yyyyMMddHHmmss";/*** 为log设置等级

*

*@paramlog

*@paramlevel*/

public static voidsetLogLevel(Logger log, Level level) {

log.setLevel(level);

}/*** 为log添加控制台handler

*

*@paramlog

* 要添加handler的log

*@paramlevel

* 控制台的输出等级*/

public static voidaddConsoleHandler(Logger log, Level level) {//控制台输出的handler

ConsoleHandler consoleHandler = newConsoleHandler();//设置控制台输出的等级(如果ConsoleHandler的等级高于或者等于log的level,则按照FileHandler的level输出到控制台,如果低于,则按照Log等级输出)

consoleHandler.setLevel(level);//添加控制台的handler

log.addHandler(consoleHandler);

}/*** 为log添加文件输出Handler

*

*@paramlog

* 要添加文件输出handler的log

*@paramlevel

* log输出等级

*@paramfilePath

* 指定文件全路径*/

public static voidaddFileHandler(Logger log, Level level, String filePath) {

FileHandler fileHandler= null;try{

fileHandler= newFileHandler(filePath);//设置输出文件的等级(如果FileHandler的等级高于或者等于log的level,则按照FileHandler的level输出到文件,如果低于,则按照Log等级输出)

fileHandler.setLevel(level);

fileHandler.setFormatter(newFormatter() {

@OverridepublicString 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 staticString getCurrentDateStr(String pattern) {

Date date= newDate();

SimpleDateFormat sdf= newSimpleDateFormat(pattern);returnsdf.format(date);

}

}

2、新建LogFactory.Java(用于获取全局log,这里的全局log不同于jdk自带log的全局log,jdk自带的全局log需要手动添加ConsoleHandler和FileHandler,这里只全部定义好了,只需要通过LogFactory.getGlobalLog()就可以获取到,使用的过程中会自动添加日志到对应的文件)

packagecn.darkranger.log.logger;importjava.io.File;importjava.util.logging.Level;importjava.util.logging.Logger;/*** Jdk再带Logger的LoggerFactory(纯手写)

*

*@authorDarkRanger

* @date 20160615

**/

public classLogFactory {//全局Log的名称

public static final String LOG_NAME = "Global";//这个文件路径必须存在,不存在会报错,并不会自动创建

public static final String LOG_FOLDER = "E:\\Log\\JDKLog";//log文件路径

private staticString log_filepath;//静态变量globleLog

private staticLogger 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 staticLogger 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);returnlog;

}public staticLogger getGlobalLog() {returnglobalLog;

}

}

3、写测试类JDKLogTest.Java

packagecn.darkranger.log.logger;importjava.io.File;importjava.util.logging.Level;importjava.util.logging.Logger;importorg.junit.Test;/*** JDK自带的Log 测试

*

*@authorDarkRanger

**/

public classJDKLogTest {//自定义的全局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");

}

@Testpublic voidtest01() {//级别从上往下依次降低

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!");

}

@Testpublic voidtest02() {

log.info("info--> this is test02 log");

}

@Testpublic voidtest03() {

sysLog.info("test03 info!");

}

@Testpublic voidtest04() {

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!

83023323a7b022b34737bb7df3ecff59.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值