为了账号安全,请及时绑定邮箱和手机立即绑定

【java】简单的日志工具类LogUtils

标签:
Java

包含两个类,LogUtils 和 LogLevel
1.使用枚举类来设置日志级别
ALL("全部", 0),INFO("信息", 1),WARN("警告", 2),ERROR("错误", 3)

/**
 * <pre>
 * 日志级别
 * ALL("全部", 0)
 * INFO("信息", 1)
 * WARN("警告", 2)
 * ERROR("错误", 3)
 * </pre>
 * 
 * @since 2018年4月9日 9:31:46
 * @author ygr
 */
public enum LogLevel {
    ALL("[]", 0), INFO("[INFO]", 1), WARN("[WARN]", 2), ERROR("[ERROR]", 3);

    private String name;
    private int level;

    LogLevel(String name, int level) {
        this.name = name;
        this.level = level;
    }

    public String getName() {
        return name;
    }

    public int getLevel() {
        return level;
    }
    /**
     * <pre>
     * 判断是否允许打印
     * </pre>
     * @author ygr
     * @date 2018年4月9日 上午9:36:47
     * @param minLevel 最低日志级别
     * @return
     */
    public boolean isAllow(LogLevel minLevel){
        if(level >= minLevel.getLevel()){
            return true;
        }

        return false;
    }
}

2.打印日志工具类,
2.1 设置是否打印 setEnable(boolean enable);
2.2 打印的级别 setLogLevel(LogLevel level);

/**
 * <pre>
 * 简单的日志工具类
 * </pre>
 * 
 * @since 2018年4月9日 上午9:30:12
 * @author ygr
 */
public class LogUtils {
    /** 默认可以打印 */
    private static boolean enable = true;
    /** 默认打印所有级别日志 */
    private static LogLevel minLevel = LogLevel.ALL;
    /** 日期显示格式 */
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");

    /**
     * <pre>
     * 设置是否开启打印
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:54:46
     * @param enable
     */
    public static void setEnable(boolean enable) {
        LogUtils.enable = enable;
    }
    /**
     * <pre>
     * 设置日志打印级别
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:09
     * @param level
     */
    public static void setLogLevel(LogLevel level) {
        LogUtils.minLevel = level;
    }

    /**
     * <pre>
     * 打印消息级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:59
     * @param msg
     *            待打印消息
     */
    public static void info(String msg) {
        finalPrint(LogLevel.INFO, msg);
    }

    /**
     * <pre>
     * 打印警告级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:59
     * @param msg
     *            待打印消息
     */
    public static void warn(String msg) {
        finalPrint(LogLevel.WARN, msg);
    }

    /**
     * <pre>
     * 打印错误级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:59
     * @param msg
     *            待打印消息
     */
    public static void error(String msg) {
        finalPrint(LogLevel.ERROR, msg);
    }

    /**
     * <pre>
     * 最终打印日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:50:21
     * @param logLevel
     *            日志级别
     * @param msg
     *            待打印消息
     */
    private static void finalPrint(LogLevel logLevel, String msg) {
        if (!enable) {
            return;
        }
        if (logLevel.isAllow(minLevel)) {
            System.out.printf("%s %s %s\n", formatCurrentTime(), logLevel.getName(), msg);
        }
    }

    /**
     * <pre>
     * 获取当前时间
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:49:00
     * @return
     */
    private static String formatCurrentTime() {
        return sdf.format(new Date());
    }
}

3.测试代码

public static void main(String[] args) throws InterruptedException {
        LogUtils.info("这是info消息");
        LogUtils.warn("这是warn消息");
        LogUtils.error("这是error消息");
        LogUtils.setEnable(false);
        LogUtils.info("这是info消息");
        LogUtils.setEnable(true);
        Thread.sleep(1000);
        LogUtils.setLogLevel(LogLevel.WARN);
        LogUtils.info("这是info消息");
        LogUtils.warn("这是warn消息");
        LogUtils.error("这是error消息");

    }

4.运行结果图图片描述


2018-04-09 16:03:48
5.高级一点的功能
1、打印日志所在类,所在行数;
2、可设置标记,方便定位;
3、可点击直接跳转。

/**
 * <pre>
 * 简单的日志工具类
 * </pre>
 * 
 * @since 2018年4月9日 上午9:30:12
 * @author ygr
 */
public class LogUtils {
    /** 默认可以打印 */
    private static boolean enable = true;
    /** 默认打印所有级别日志 */
    private static LogLevel minLevel = LogLevel.ALL;
    /** 默认保存到磁盘 */
    private static boolean persistent = true;
    /** 日期显示格式 */
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    private static Date date = null;

    /**
     * <pre>
     * 设置是否开启打印
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:54:46
     * @param enable
     */
    public static void setEnable(boolean enable) {
        LogUtils.enable = enable;
    }

    /**
     * <pre>
     * 设置是否持久化
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午12:47:50
     * @param persistent
     */
    public static void setPersistent(boolean persistent) {
        LogUtils.persistent = persistent;
    }

    /**
     * <pre>
     * 设置日志打印级别
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:09
     * @param level
     */
    public static void setLogLevel(LogLevel level) {
        LogUtils.minLevel = level;
    }

    /**
     * <pre>
     * 打印消息级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:59
     * @param msg
     *            待打印消息
     */
    public static void info(String msg) {
        finalPrint(LogLevel.INFO, msg);
    }

    /**
     * <pre>
     * 打印消息级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午3:54:56
     * @param msg
     *            待打印消息
     * @param tag
     *            特殊标记
     */
    public static void info(String msg, String tag) {
        finalPrint(LogLevel.INFO, msg, tag);
    }

    /**
     * <pre>
     * 打印警告级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:59
     * @param msg
     *            待打印消息
     */
    public static void warn(String msg) {
        finalPrint(LogLevel.WARN, msg);
    }

    /**
     * <pre>
     * 打印警告级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午3:54:56
     * @param msg
     *            待打印消息
     * @param tag
     *            特殊标记
     */
    public static void warn(String msg, String tag) {
        finalPrint(LogLevel.WARN, msg, tag);
    }

    /**
     * <pre>
     * 打印错误级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:42:59
     * @param msg
     *            待打印消息
     */
    public static void error(String msg) {
        finalPrint(LogLevel.ERROR, msg);
    }

    /**
     * <pre>
     * 打印错误级别日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午3:54:56
     * @param msg
     *            待打印消息
     * @param tag
     *            特殊标记
     */
    public static void error(String msg, String tag) {
        finalPrint(LogLevel.ERROR, msg, tag);
    }

    /**
     * <pre>
     * 最终打印日志
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:50:21
     * @param logLevel
     *            日志级别
     * @param msg
     *            待打印消息
     */
    private static void finalPrint(LogLevel logLevel, String msg) {
        finalPrint(logLevel, msg, null);
    }

    /**
     * <pre>
     * 多一个tag标记
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午3:52:07
     * @param logLevel
     * @param msg
     * @param tag
     */
    private static void finalPrint(LogLevel logLevel, String msg, String tag) {
        // 不允许打印
        if (!enable) {
            return;
        }
        // 允许打印该级别日志
        if (logLevel.isAllow(minLevel)) {

            StringBuilder builder = new StringBuilder();
            builder.append(formatCurrentTime()).append(" ");
            // 属性信息
            StackTraceElement traceElement = getStackTraceElement();
            if (traceElement != null) {
                builder.append("(").append(traceElement.getFileName()).append(":").append(traceElement.getLineNumber())
                        .append(")").append("  ");
            }
            // 有特殊标记
            if (tag != null && tag.length() != 0) {
                builder.append("[").append(tag).append("]").append("  ");
            }
            // 级别和最终消息
            builder.append(logLevel.getName()).append(" ").append(msg);

            String message = builder.toString();

            System.out.println(message);
            // 持久化
            if (persistent) {
                PersistentUtils.save(message);
            }
        }
    }

    /**
     * <pre>
     * 获取当前时间
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 上午9:49:00
     * @return
     */
    private static String formatCurrentTime() {
        date = new Date();
        return sdf.format(date);
    }

    /**
     * <pre>
     * 获取打印日志的所属文件、所在行数等信息
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午3:41:10
     * @return
     */
    private static StackTraceElement getStackTraceElement() {
        StackTraceElement[] trace = Thread.currentThread().getStackTrace();
        int methodCount = 1;
        int stackOffset = getStackOffset(trace);

        if (methodCount + stackOffset > trace.length) {
            methodCount = trace.length - stackOffset - 1;
        }

        for (int i = methodCount; i > 0; i--) {
            int stackIndex = i + stackOffset;
            if (stackIndex >= trace.length) {
                continue;
            }
            StackTraceElement element = trace[stackIndex];
            return element;
        }

        return null;
    }

    /**
     * <pre>
     * 获取栈的偏移位置
     * </pre>
     * 
     * @author ygr
     * @date 2018年4月9日 下午3:36:30
     * @param trace
     * @return
     */
    private static int getStackOffset(StackTraceElement[] trace) {
        for (int i = 2; i < trace.length; i++) {
            StackTraceElement e = trace[i];
            String name = e.getClassName();
            if (!name.equals(LogUtils.class.getName())) {
                return --i;
            }
        }
        return -1;
    }
}

6.运行效果图
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
14
获赞与收藏
93

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消