在Java程序中的日志,想必我们已经不陌生了吧!对于控制台System.out.println();输出的每个程序都可以看作成日志!
但是,相比于真正意义上的日志还是有很大区别的!
上述每个红框框所标注的都是真正日志的组成数据! 包含有:时间日期(精确到毫秒),日志级别(ERROR, WARN, INFO, DEBUG, 或TRACE),进程ID,线程名,Logger名(通常使用源代码的类名),日志内容等各种数据!
但是,作为一个Java后端程序员,我们该如何自定义日志呢??
@RestController
public class LoggerController {@PostConstructpublic void print(){System.out.println("我是一个日志!");}
}
是上述的方法自定义日志吗??是??
其实不是!!上述代码的运行结果为:
显而易见,这并不是一个规范的日志数据!
日志数据打印!
那么,我们该如何规范的打印出自定义的日志数据呢?
@RestController
public class LoggerController {//首先创建一个日志对象//Logger来自于slf4j包!!private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@PostConstructpublic void print(){System.out.println("我是一个日志!");//使用日志对象logger来打印日志logger.info("======我是一个由程序员自定义的日志数据======");}
}
上述代码的运行结果为:
看着是不是有模有样了呢??
值得注意的是:
但是,对于日志级别有好几种:
日志级别从高到底依次为:FATAL, ERROR, WARN, INFO, DEBUG, TRACE
FATAL:致命信息,表示需要立即被处理的系统级错误。
ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。
WARN:警告信息,不影响使用,但需要注意的问题。
INFO:普通信息,用于记录应用程序正常运行时的一些信息,列如系统启动完成,请求处理完成等。
DEBUG:调试信息,需要调试时候的关键信息打印。
TRACE:追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)。
那么,我们来试着打印不同级别的日志信息吧!
@RestController
public class LoggerController {//首先创建一个日志对象//Logger来自于slf4j包!!private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@PostConstructpublic void print(){System.out.println("我是一个日志!");//使用日志对象logger来打印日志logger.info("======我是一个由程序员自定义的日志数据======");//fatal级别的日志不能被打印!(太严重了)程序已经崩溃logger.error("我是一个error级别的日志信息");logger.warn("我是一个warn级别的日志信息");logger.info("我是一个info级别的日志信息");logger.debug("我是一个debug级别的日志信息");logger.trace("我是一个trace级别的日志信息");}
}
在上述的几个日志级别中,fatal级别的日志不能被打印!(太严重了)程序已经崩溃!!
那么,我们来看一下程序的运行结果吧!!
但是,根据上述程序的运行结果,我们仅仅看出打印出来了:ERROR, WARN, INFO这三个级别的日志,那么,对于DEBUG ,TRACE级别的日志信息哪去了??其实IDEA程序默认的级别为INFO,比其严重的级别日志才可以正常打印,否则不给予打印!
那么,我们该如何处理这个问题呢?
这就需要我们在配置文件中自定义日志级别了!
#设置日志级别
logging:level:root: debug
值得注意的 是:root表示根目录,意思是项目中的所有日志级别都是debug!!
经过上述配置文件的配置以后,并重启程序,我们便可以看出:
另:由于将日志默认级别INFO更改为DEBUG,运行程序,导致在控制台输出很多数据……不用担心,这是我们之前Debug的数据!没啥用!!
当然,上述仅截图部分!!尴尬!
同理,当我们设置日志级别为:trace
#设置日志级别
logging:level:root: trace
值得注意的 是:root表示根目录,意思是项目中的所有日志级别都是trace!!
运行结果为:
当然,我们也可以分目录来设置日志的打印级别!
#设置日志级别
logging:level:root: infocom:example:captcha: debug
重启程序,此时控制台的运行结果便显得干净整齐了不少!!
设置日志级别颜色,感觉很炫!感兴趣的铁质自行百度搜索,在此小编便不再傻瓜式讲解!!
日志持久化!
保存日志数据,如:保存在硬盘中。
设置文件存储:
#设置日志级别
logging:level:root: infocom:example:captcha: debugfile:name: aaa.log
运行程序,我们便可以发现:Idea中新增了一个aaa.log的文件
我们可以看到aaa.log文件存储的便是我们刚刚所生成的日志内容!!
当然,上述存储的日志内容并没有添加相对路径(绝对路径),因此生成的数据会保存在项目所在的文件内部!
我们也可以自定义路径来保存日志内容!
#设置日志级别 logging:level:root: infocom:example:captcha: debugfile:name: logger/controller.log
将其保存在logger文件夹下的controller.log文件中
当然,我们也可以使用path来进行设置!
二者了解其中一个即可!!
name的使用范围比较广!!靠谱!
当然,更简单的方法便是用@Slf4j这个注解!
连Logger对象都不用创建了,直接使用log即可!!
@Slf4j
@RestController
public class LoggerController {//首先创建一个日志对象//Logger来自于slf4j包!!//private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@PostConstructpublic void print(){System.out.println("我是一个日志!");//使用日志对象logger来打印日志log.info("======我是一个由程序员自定义的日志数据======");//fatal级别的日志不能被打印!(太严重了)程序已经崩溃log.error("我是一个error级别的日志信息");log.warn("我是一个warn级别的日志信息");log.info("我是一个info级别的日志信息");log.debug("我是一个debug级别的日志信息");log.trace("我是一个trace级别的日志信息");}
}
而且代码的运行效果也是一样的!!