日志、日志,日志就是记录发生了什么。为啥要记录发生了什么呢?想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?因此我们需要记录程序的行为,通过这些行为能让我们更好的发现和定位错误所在位置。
除了发现和定位问题之外,还可以通过⽇志实现以下功能:
可以看出来日志在程序中扮演这非常重要的角色了。
SpringBoot 项目启动的时候默认就会有日志输出,如下图:
通过上述日志信息提出三个疑问:
接下来让我们寻找找答案
自定义打印日志分为两步走:
//1.得到日志对象
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
在导包时,我们使用的时slf4j包
下面的 Logger
,这里不要导包导错了。
因为 SpringBoot 中内置了日志框架slf4j
,所以我们可以直接在程序中调用slf4
来输出日志。
// 2.使⽤⽇志打印⽇志
logger.info("--------------要输出⽇志的内容----------------");
日志打印结果:
这日志打印出来看起来像是一串字符串,我们如何去看出来日志打印的是什么东西呢?看下图的介绍:
日志之间有很多等级划分,我们通常把他分为六个等级。
日志级别一览表(由上到下等级递增):
等级 | 解释 |
---|---|
trace | 微量,少许的意思,级别最低的日志 |
debug | 需要调试时候的打印关键信息 |
info | 普通打印信息,也是默认日志级别 |
warn | 警告,这个级别的日志不影响使用,但需要注意问题 |
error | 错误信息,级别较高的错误日志信息 |
fatal | 致命的,因为代码异常导致程序退出执行的事件 |
第一条也许比较难理解,我们写代码演示一下,我们知道日志等级默认的是info
级别的,我们打印如下日志:
@Controller
@ResponseBody
public class TestController {
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/sayHi")
public String sayHi(String name) {
logger.trace("----------- 我是 trace 级别的日志 -----------");
logger.debug("----------- 我是 debug 级别的日志 -----------");
logger.info("----------- 我是 info 级别的日志 -----------");
logger.warn("----------- 我是 warn 级别的日志 -----------");
logger.error("----------- 我是 error 级别的日志 -----------");
if(!StringUtils.hasLength(name)) {
name ="张三";
}
String res = "你好" + name;
return res;
}
观察控制台:
你会新奇的发现,比info
级别小的日志,没有出现在控制台,也就是没有打印,这就是第一条说的, 日志级别可以帮你筛选出重要的信息。
这个日志级别怎么有用,我们应该如何设置日志级别呢?答案是在配置文件(yaml文件或者properties文件)中设置,我们这里使用yaml文件。
打印大于error级别的日志,如下图,:
logging:
level:
root: error
设置完等级,我们再次启动项目,看看是否符合我们的预期,看下图,它符合我们的预期,只打印了 error级别的日志。
上方举得例子都是打印在控制台上的,然而在生产环境上需要将日志持久化保存下来,以便追溯问题位置。
想要将日志进行持久化保存,只需要在配置文件中指定日志的存储目录或者指定日志保存文件名之后,SpringBoot 就会将控制台的日志写到我们配置的目录或文件中去。
配置文件的保存路径:
# 设置日志文件的目录
logging:
file:
path: F:\\info\\
我们再次启动项目,打开设置好的路径,看看是否有日志保存:
打开后可以看到有日志保存,证明我们的设置是正确的。
每次打印日志,我们都是使用 LoggerFactory.getLogger(×××.class)这样的操作,代码显得冗余,我们可以使用更简单好用的日志输出方法,使用 lombok 来更简单的输出。
其步骤大概分为两步:
@Slf4j
注解输出日志这个框架提供了非常多的简便注解,可以减少代码冗余,如果有需要可以去了解一下!
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
我们在类上方添加@Slf4j
注释,在使用时我们就会得到一个对象log对象。代码如下:
@Controller
@ResponseBody
@Slf4j
public class TestController {
@RequestMapping("/sayHi")
public String sayHi(String name) {
log.trace("----------- 我是 trace 级别的日志 -----------");
log.debug("----------- 我是 debug 级别的日志 -----------");
log.info("----------- 我是 info 级别的日志 -----------");
log.warn("----------- 我是 warn 级别的日志 -----------");
log.error("----------- 我是 error 级别的日志 -----------");
if(!StringUtils.hasLength(name)) {
name ="张三";
}
String res = "你好" + name;
return res;
}
}
@Slf4j
注解和 log对象 快速的打印自定义日志。