包含两个类,LogUtils 和 LogLevel

1.使用枚举类来设置日志级别

ALL("全部", 0),INFO("信息", 1),WARN("警告", 2),ERROR("错误", 3)

/**

*

* 日志级别

* ALL("全部", 0)

* INFO("信息", 1)

* WARN("警告", 2)

* ERROR("错误", 3)

*

*

* @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;

}

/**

*

* 判断是否允许打印

*

* @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);

/**

*

* 简单的日志工具类

*

*

* @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");

/**

*

* 设置是否开启打印

*

*

* @author ygr

* @date 2018年4月9日 上午9:54:46

* @param enable

*/

public static void setEnable(boolean enable) {

LogUtils.enable = enable;

}

/**

*

* 设置日志打印级别

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:09

* @param level

*/

public static void setLogLevel(LogLevel level) {

LogUtils.minLevel = level;

}

/**

*

* 打印消息级别日志

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:59

* @param msg

* 待打印消息

*/

public static void info(String msg) {

finalPrint(LogLevel.INFO, msg);

}

/**

*

* 打印警告级别日志

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:59

* @param msg

* 待打印消息

*/

public static void warn(String msg) {

finalPrint(LogLevel.WARN, msg);

}

/**

*

* 打印错误级别日志

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:59

* @param msg

* 待打印消息

*/

public static void error(String msg) {

finalPrint(LogLevel.ERROR, msg);

}

/**

*

* 最终打印日志

*

*

* @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);

}

}

/**

*

* 获取当前时间

*

*

* @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、可点击直接跳转。

/**

*

* 简单的日志工具类

*

*

* @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;

/**

*

* 设置是否开启打印

*

*

* @author ygr

* @date 2018年4月9日 上午9:54:46

* @param enable

*/

public static void setEnable(boolean enable) {

LogUtils.enable = enable;

}

/**

*

* 设置是否持久化

*

*

* @author ygr

* @date 2018年4月9日 下午12:47:50

* @param persistent

*/

public static void setPersistent(boolean persistent) {

LogUtils.persistent = persistent;

}

/**

*

* 设置日志打印级别

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:09

* @param level

*/

public static void setLogLevel(LogLevel level) {

LogUtils.minLevel = level;

}

/**

*

* 打印消息级别日志

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:59

* @param msg

* 待打印消息

*/

public static void info(String msg) {

finalPrint(LogLevel.INFO, msg);

}

/**

*

* 打印消息级别日志

*

*

* @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);

}

/**

*

* 打印警告级别日志

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:59

* @param msg

* 待打印消息

*/

public static void warn(String msg) {

finalPrint(LogLevel.WARN, msg);

}

/**

*

* 打印警告级别日志

*

*

* @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);

}

/**

*

* 打印错误级别日志

*

*

* @author ygr

* @date 2018年4月9日 上午9:42:59

* @param msg

* 待打印消息

*/

public static void error(String msg) {

finalPrint(LogLevel.ERROR, msg);

}

/**

*

* 打印错误级别日志

*

*

* @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);

}

/**

*

* 最终打印日志

*

*

* @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);

}

/**

*

* 多一个tag标记

*

*

* @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);

}

}

}

/**

*

* 获取当前时间

*

*

* @author ygr

* @date 2018年4月9日 上午9:49:00

* @return

*/

private static String formatCurrentTime() {

date = new Date();

return sdf.format(date);

}

/**

*

* 获取打印日志的所属文件、所在行数等信息

*

*

* @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;

}

/**

*

* 获取栈的偏移位置

*

*

* @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.运行效果图

打开App,阅读手记

logutils java_【java】简单的日志工具类LogUtils相关推荐

  1. java简单密码校验工具类及弱密码说明

    1.连续性弱密码校验 描述:密码连续性校验是指123456,654321,abcdefg,gfedcba等数字和字母顺序是连续的字符称之为连续性弱密码. 校验方式:PassWordUtil.java通 ...

  2. java log 封装_工具类之LogUtils

    安卓开发离不开记录log日志,封装了一份简单的日志工具类,具有设置日志总开关,是否写入文件,日志过滤器和自定义标签,锁定打印log的类.函数名及行号,初始化有可以使用init函数也可以使用建造者模式, ...

  3. Java 线程 - 基础及工具类 (二)

    Java 并发系列文章 Java 线程 - 并发理论基础(一) Java 线程 - 基础及工具类 (二) Java 线程 - 并发设计模式 (三) Java 线程(二) 通用的线程生命周期 Java ...

  4. JAVA I/O流工具类TextFile

    JAVA I/O流工具类TextFile由广州疯狂软件java培训分享: 本文是一个TextFile类,通过这个类我们可以调用其中的方法来简化对文件的读写,这段代码的可用性比较强.这个TextFile ...

  5. 日志打印工具类LogUtils

    /** * 日志工具类: * 我们在项目中经常会打印日志,但是在项目上线后日志仍然会打印 * 这样会降低程序运行效率,因此需要在项目上线的时候把日志屏蔽掉 */ public class LogUti ...

  6. 解密android日志xlog,安卓开发技巧2:自定义日志工具类XLog的实现

    安卓开发技巧二:自定义日志工具类XLog的实现 我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项 ...

  7. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  8. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  9. java项目常用的工具类

    前言 在开发过程中,我们会遇到很多繁琐或者棘手的问题,但是,这些问题往往会存在一些便捷的工具类,来简化我们的开发,下面是我工作中经常使用到的工具类 常用工具类 日期工具类 import java.te ...

  10. 「Java工具类」pdf导出工具类java导出pdf文件工具类

    介绍语 本号主要是Java常用关键技术点,通用工具类的分享:以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+d ...

最新文章

  1. 没错,使用 Nacos 踩坑了
  2. Servlet登陆功能的实现
  3. 【安全实战】红队攻防技术
  4. 【转】volatile关键字。编译器不优化,多线程会改。防止随时变动的
  5. 【Transformer】TransMix: Attend to Mix for Vision Transformers
  6. 华为手机应用鸿蒙os,华为手机内置应用逐渐向鸿蒙 OS 靠拢
  7. 职场中,要善于交换利益
  8. python3.7安装pyltp出错_安装pyltp遇到的问题及解决办法
  9. 解决:启动项目报错 java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory...
  10. 解决From 192.168.1.10: icmp_seq=1 Redirect Network(New nexthop: 192.168.1.1)问题
  11. 永久删除暴风影音服务项,去除 stormliv.exe 进程
  12. vs2008 sp1
  13. 黑群晖frp内网穿透配置
  14. 题解 | Guessing ETT-2019牛客暑期多校训练营第三场C题
  15. C++——输入、输出和文件
  16. Koa2实现电影微信公众号前后端开发学习视频
  17. VMWare下载安装以及创建虚拟机教程
  18. java 操作Zip文件(压缩、解压、加密)
  19. 2018 拼多多 校招真题 最大乘积
  20. RabbitMQ topics

热门文章

  1. 像模拟人生的 java游戏下载_我的世界1.7.2模拟人生整合包
  2. 支付宝SOFA架构:降低业务系统复杂度
  3. 网页颜色搭配表及颜色搭配技巧
  4. node 生成随机头像_给微信设置卡通头像,再不怕撞脸!
  5. 计算机负数是取反加1,负数补码是取反加一,但-42取反后末位是1,如何加1?
  6. 1038 统计同成绩学生
  7. cmd里面import不是内部外部命令
  8. Python中字符的匹配
  9. 台湾嵌入式软硬件厂商组建联盟 欲分Gphone一杯羹
  10. U盘里面的文件夹变成文件也打不开文件的寻回方法