博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java日志组件1---Jdk自带Logger(java.util.logging.Logger)
阅读量:6371 次
发布时间:2019-06-23

本文共 6944 字,大约阅读时间需要 23 分钟。

最近在看日志的一些东西,发现利用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!

 

 

转载于:https://www.cnblogs.com/wrcold520/p/5587680.html

你可能感兴趣的文章
显示本月每一天日期
查看>>
[转]java 自动装箱与拆箱
查看>>
NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
查看>>
think in coding
查看>>
IdHttpServer实现webservice
查看>>
HTML的音频和视频
查看>>
Unsupported major.minor version 52.0
查看>>
面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式
查看>>
优酷网架构学习笔记
查看>>
把HDFS里的json数据转换成csv格式
查看>>
WEEX-EROS | 集成并使用 bindingx
查看>>
广州牵引力来告诉你学编程先学什么语言好?
查看>>
广州牵引力总结初学者怎样学好UI设计?
查看>>
使用Metrics方法级远程监控Java程序
查看>>
Spring核心系列之Bean的生命周期
查看>>
VasSonic源码之并行加载
查看>>
小程序 LRU 存储设计
查看>>
Android 多线程之阻塞队列
查看>>
Haskell 在 macOS 下的环境搭建
查看>>
适配mpvue平台的的微信小程序日历组件mpvue-calendar
查看>>