一个微型 Java project 初次开发尝试结束了,几经波折,海量数据终于被按时拉取插入数据库,看着控制台那快速跳跃的输出,我终于松了一口气。然而,要想让别人也可以时刻把控这个项目框架,我还需要设计一个日志工具,用来记录程序运行的输出信息和异常捕获信息,网上关于此类的记录不是用的第三方工具就是零零散散,说的不明不白,那就不如我们自己使用jdk基础工具包打造自己的 java project 日志记录工具吧!
Java.util.logging:
JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。
Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:
此工具主要包含两个主要类:
1、 为log设置等级、添加log控制台handler、添加log文件输出handler
package com.soocedu.datatransfer;
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;
/**
*
* @author: regan_wu
* @description:日志记录工具类。
* @date:2018年9月28日
*/
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 final String DATE_PATTERN_SHORT = "yyyy-MM-dd ";
/**
* 为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、用于获取全局log,这里的全局log不同于jdk自带log的全局log,jdk自带的全局log需要手动添加ConsoleHandler和FileHandler,这里只全部定义好了,只需要通过LogFactory.getGlobalLog()就可以获取到,使用的过程中会自动添加日志到对应的文件。
package com.soocedu.datatransfer;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author: regan_wu
* @description:日志工厂,用于设置全局日志。
* @date:2018年9月28日
*/
public class LogFactory {
// 全局Log的名称
public static final String LOG_NAME = "Global";
// 这个文件路径必须存在,不存在会报错,并不会自动创建
public static final String LOG_FOLDER = "E:\\Log\\SoocDataSyncLog";
// log文件路径
private static String log_filepath;
// 静态变量globleLog
private static Logger globalLog;
static {
// 加载类的时候初始化log文件全路径,这里的文件名称是JDKLog_+时间戳+.log
log_filepath = LOG_FOLDER + File.separator + "SoocDataSyncLog_" + 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;
}
}
网友评论