美文网首页
使用jdk基础工具包打造自己的 java project 日志记

使用jdk基础工具包打造自己的 java project 日志记

作者: 一步拾光 | 来源:发表于2018-09-28 17:04 被阅读65次

一个微型 Java project 初次开发尝试结束了,几经波折,海量数据终于被按时拉取插入数据库,看着控制台那快速跳跃的输出,我终于松了一口气。然而,要想让别人也可以时刻把控这个项目框架,我还需要设计一个日志工具,用来记录程序运行的输出信息和异常捕获信息,网上关于此类的记录不是用的第三方工具就是零零散散,说的不明不白,那就不如我们自己使用jdk基础工具包打造自己的 java project 日志记录工具吧!

Java.util.logging:

JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。

Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:

image

此工具主要包含两个主要类:

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;

    }

}

3、效果:

image

你是否get到了呢?

最后附上今天特别喜欢的一句歌词:一条路的两端,以梦为马算不出流年。

2018.09.28

相关文章

网友评论

      本文标题:使用jdk基础工具包打造自己的 java project 日志记

      本文链接:https://www.haomeiwen.com/subject/kgvpoftx.html