前言:
大家好,我是良辰丫,在上一篇文章中我们已经学习了Spring Boot的配置,接下来我们要学习一些日志相关的东西,什么是日志呢?我们慢慢往下看.💌💌💌
🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。
1. 初识日志
什么是日志呢?
日志
相当于我们自己写的日记,记录自己的真实生活所发生的事情.- 在计算机中,
日志
是我们程序(或者系统)写的日记,记录系统运行过程中各种重要信息的文件,在系统运行过程中由各进程创建并记录。- 简单来说,日志就是记录时间以及各种进程或者线程发生的数据的文件,比如错误信息,修改信息等.
日志有什么作用呢?
- 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。也就是服务器通过日志可以有效地减少用户恶意破解登录,有效的保障了用户的安全.
- 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。程序有问题,我们可以通过日志快速的定位,并且进行相应的操作去修改错误.
- 记录程序的执⾏时间,⽅便为以后优化程序提供数据支持。通过时间我们可以知道哪个时间段程序(系统)做了什么.
简而言之,记录系统的运行过程及异常信息,为快速定位系统运行中出现的问题及开发过程中的程序调试问题提供详细信息(也就是快速找到错误原因)。
2. Spring Boot的日志
在我们的Spring Boot的控制台上其实就有日志信息.
- Spring Boot 内置了⽇志框架, 控制台上自行的打印自己的日志信息.
- 了解了Spring Boot 控制台的日志后,接下来我们来一起去学习程序员如何定义日志并且去使用日志.
3. 自定义日志
- 得到日志对象.
- 打印日志内容.
完整代码:
package ***.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
@RequestMapping("/user5")
@Controller
@ResponseBody // 用来设置当前类中所有的方法返回的是数据而非页面
public class User5 {
// 1.得到日志对象
private static final Logger logger = LoggerFactory.getLogger(User5.class);
@RequestMapping("/log")
public String sayHi() {
// 写日志
logger.trace("我是 trace");
logger.debug("我是 debug");
logger.info("我是 info");
logger.warn("我是 warn");
logger.error("我是 error");
System.out.println("日志打印完成.");
return "Hi,叶良辰.";
}
}
3.1 得到日志对象
- 注意代码中好多东西都是规定哈,没有什么为什么,比如使用LoggerFactory,大家多写几次,熟悉就行了.
- 为了定位我们的日志属于哪个类,我们需要把类名传进去.
- 很多人会因为导错包而会出现没有找到该关键字的错误,我们要导入的包是org.slf4j.
// 1.得到日志对象
private static final Logger logger = LoggerFactory.getLogger(User5.class);
3.2 打印日志内容
日志内容有很多种,我们先来采取几种看一下效果.
@RequestMapping("/log")
public String sayHi() {
// 写日志
logger.trace("我是 trace");
logger.debug("我是 debug");
logger.info("我是 info");
logger.warn("我是 warn");
logger.error("我是 error");
System.out.println("日志打印完成.");
return "Hi,叶良辰.";
}
- 我们需要重启服务器,也就是Spring Boot.
- 通过浏览器访问我们的页面,
一定要进行访问,要不然控制台不会出现我们的日志信息
,为什么我的端口号是8888呢,在上一篇配置文件的文章中,我们为了说明端口配置,把端口号改成了8888.
运行结果如下:
- 在这个时候,我们发现问题了,我们有5个日志,为什么打印出3个呢?
- 我们在代码中有一条"日志打印完成"的输出语句,就是为了表示日志打印完成了,在我们的控制台上已经打印出来了该语句,那么说明打印已经完成,为什么日志没有全部打印呢?
- 原来呀,我们的日志是有一定的级别的,具体怎么回事呢?别着急,我们在了解日志级别之前,先来了解一些日志相关的东西.
3.3 日志格式
- 日志打印时间 : 记录日志的时间.
- 日志打印级别,在下面我们会进行介绍.
- 线程ID,日志往往是通过线程负责的,在这里,咱们的线程是Spring Boot分配的,每次运行分配的线程一般是不同的.
- 线程名称,这里指的是系统对线程的命名.
- 执行的类名,表示该日志是打印哪个类的日志信息.
- 日志信息,程序员定义的,用来表示日志数据.
3.4 简述日志框架
- Spring Boot在设计日志框架的时候采取了门面模式,这是一种设计模式.但是23种设计模式中没有门面模式,因为门面模式是最后出来的.
- 门面模式的主要作用是解耦,Spring Boot内置了日志框架,程序员在使用的时候只需要调用slf4j就可以了,slf4j这相当于一个中介,它负责处理细节,我们使用的时候只需要去调用它即可,不需要关注它的细节.
4. 日志级别
4.1 日志级别的作用
学习日志级别,首先我们需要去了解日志级别的作用.
- ⽇志级别可以帮你筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者信息筛选的时间。
- ⽇志级别可以控制不同环境下,⼀个程序是否需要打印⽇志,如开发环境我们需要很详细的信息,⽽⽣产环境为了保证性能和安全性就会输⼊尽量少的⽇志,⽽通过⽇志的级别就可以实现此需求。
4.2 日志级别分类
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认⽇志级别);
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
4.3 日志级别使用规则
- 当程序中设置了日志级别后,那么程序只会打印和级别相同或者大于当前几倍的日志,小于当前级别的日志不会输出
- Spring Boot的默认级别是info.咱们在上面打印出三条日志信息,大于等于info的日志才会被打印出来,大于等于info级别的有三个,因此打印三条.
在yml中设置日志级别,我们设置一个trace级别,重启服务器,重新访问页面.
# 配置日志级别
logging:
level:
root: trace
运行结果:
此时,我们的五条日志信息全部打印出来了.
5. 日志持久化
- 在上述我们的日志只是短暂的存储,重启服务器就会消失,我们需要把日志持久化存储,才能方便我们随时查看,因此呢,我们需要把日志存储在文件中.
- 以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做
持久化
。
5.1 配置日志文件路径
# 设置⽇志⽂件的⽬录
logging:
file:
path: D:\\aaa
5.2 配置日志文件名称
logging:
file:
name: D:\\aaa\\log.log
注意一级标签一个yml文件往往只能写一次,什么意思呢?通过下图大家可以得出,这是yml专门这样设置的.减少冗余度,两条归属于同一个一级标签,直接写到一个一级标签下面即可.
两块代码合并如下:
logging:
file:
path: D:\\aaa
name: D:\\aaa\\log.log
重启服务器,在我们的相应目录下自动生成我们的日志文件.
以记事本的形式打开,就是我们的日志信息了.
我们也可以根据不同的日志级别
logging:
file:
path: D:\\aaa
name: springboot-log.log
level:
root: error
***:
example:
demo:
controller: error
service: info
6. Lombok 日志输出
Lombok是我们在java中经常使用的东西,大家一定要去掌握常见的东西.
- pom.xml中添加Lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
- @Slf4j注解控制日志
使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,
这是 lombok 提供的对象名,人家规定的,还是那句话,没有那么多为什么哈哈!!!
package ***.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@RequestMapping("/user6")
@Controller
@ResponseBody // 用来设置当前类中所有的方法返回的是数据而非页面
@Slf4j
public class User6 {
@RequestMapping("/log")
public String sayHi() {
// 写日志
log.trace("我是 trace");
log.debug("我是 debug");
log.info("我是 info");
log.warn("我是 warn");
log.error("我是 error");
System.out.println("日志打印完成.");
return "Hi,叶良辰.";
}
}
通过浏览器进行访问页面,仍然能得到我们的日志信息.
我们的日志文件中也会存在日志信息: