一、日志有什么用?
日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的原因吗?
答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说,最主要的用途就是排除和定位问题。
除了
发现和定位问题
之外,我们还可以通过日志实现以下功能:
- 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
- 记录系统的操作日志,方便数据恢复和定位操作人。
- 记录程序的执行时间,方便为以后优化程序提供数据支持。
以上这些都是日志提供的非常实用的功能。
日志真实使用案例:
关键节点上的关键数据日志记录举例:例如,比如一个教务系统,在注册时候不止要在教务系统添加一条用户记录,同时也会给论坛添加一条一模一样的用户记录,这样做的目的是为了实现一次注
册,多处使用的目的。不需要用户在两边系统注册了,等于在程序中以极低的成本实现的用户数据的同步,但这样设计有一个致命的问题,用户在教务系统注册信息的时候,如果论坛挂了,那么用户的注册行为就会失败?因为用户在注册的时候需要同步注册到论坛系统,但论坛现在挂了,这个时候怎么办呢?
最简单的解决方案,教务系统在注册的时候,不管论坛是否注册成功,都给用户返回成功,那这个时候如果论坛注册失败了怎么办?非常简单,如果注册失败了,记录一下日志,等论坛恢复正常之后,把日志给论坛的管理人员,让他手动将注册失败的用户同步到论坛系统,这样就最低成本的解决了问题。这就是日志的重要作用。
二、日志怎么用?
Spring Boot
项目在启动的时候默认就有日志输出,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/107862c54c5534e9c71d4a17e8d1f0f5.png)
以上内容就是
Spring Boot
输出的控制台日志信息。
通过上述日志信息我们能发现以下
3
个问题:
- Spring Boot 内置了日志框架(不然也输出不了日志)。
- 默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢?
- 日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么怎么把日志永久的保存下来呢?
下面我们一起来找寻这些问题的答案
三、自定义日志打印
开发者自定义打印日志的实现步骤:
- 在程序中得到日志对象。
- 使用日志对象的相关语法输出要打印的内容。
接下来我们分别来看。
3.1 在程序中得到日志对象
在程序中获取日志对象需要使用日志工厂
LoggerFactory
,如下代码所示:
// 1.得到日志对象
private static Logger logger = LoggerFactory.getLogger(UserController.class);
日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定
位到问题类。
注意:
Logger
对象是属于
org.slf4j
包下的
,不要导入错包。
![](https://i-blog.csdnimg.cn/blog_migrate/f7675e0c78f00ed58cc1ff7ac30ff6b0.png)
因为
Spring Boot
中内置了日志框架
Slf4j
,所以咱们可以直接在程序中调用
slf4j
来输出日志。
常见的日志框架说明(了解)
![](https://i-blog.csdnimg.cn/blog_migrate/f356a5c95d3b78f7b46d782351e15e7f.png)
3.2 使用日志对象打印日志
日志对象的打印方法有很多种,我们可以先使用
info()
方法来输出日志,如下代码所示:
// 2.使用日志打印日志
logger.info("--------------要输出日志的内容----------------");
打印日志效果展示:
![](https://i-blog.csdnimg.cn/blog_migrate/3042a8140c54483a16665d19325d6842.png)
3.3 日志格式说明
![](https://i-blog.csdnimg.cn/blog_migrate/0f9c65a462b7de094e6522633eb28eb5.png)
四、日志级别
4.1 日志级别是用?
日志的级别就是为了筛选符合目标的日志信息的。试想一下这样的场景,假设你是一家
2
万人公司的老板,那么每个员工的日常工作和琐碎的信息都要反馈给你吗?一定不会,因为你根本没有那么多精力。于是就有了组织架构,而组织架构就会分级,有很多的级别设置,如下图所示:
有了组织架构之后,就可以逐级别汇报消息了,例如:组员汇报给组长;组长汇报给研发一组;研发一组汇报给 Java
研发,等等依次进行汇报。
而日志分级大概的道理也是一样的,有了日志级别之后就可以过滤自己想看到的信息了,比如设置日志级别为 error
,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者的信息筛选时间。
4.2 日志级别的分类与使用
日志的级别分为:
- trace:微量,少许的意思,级别最低;
- info:普通的打印信息;
- debug:需要调试时候的关键信息打印;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。
日志级别的顺序:
越往上接收到的消息就越少。
日志使用
日志级别配置只需要在配置文件中设置
“logging.level”
配置项即可,如下所示:
logging:
level:
root: error
配置跟路径的日志级别。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
// 1.得到日志对象
private static Logger logger =
LoggerFactory.getLogger(UserController.class);
@Value("${server.port}")
private String port;
@Value("${spring.datasource.url}")
private String url;
@RequestMapping("/sayhi")
public String sayHi() {
// 2.使用日志打印日志
logger.trace("================= trace ===============");
logger.debug("================= debug ===============");
logger.info("================= info ===============");
logger.warn("================= warn ===============");
logger.error("================= error ===============");
return "Hi," + url;
}
}
默认日志输出级别
清除掉配置文件中的日志设置,观察控制台输入的日志级别。
得到以下结论,日志的输出级别,默认是
info
。
五、日志持久化
以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。
想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后,Spring Boot 就会将控制台的日志写到相应的目录或文件下了。
配置日志文件的保存路径:
# 设置日志文件的目录
logging:
file:
path: D:\home\ruoyi
配置日志文件的文件名:
# 设置日志文件的文件名
logging:
file:
name: D:\home\ruoyi\spring-1204.log
六、更简单的日志输出—lombok
每次都使用
LoggerFactory.getLogger(xxx.class)
很繁琐,且每个类都添加一遍,也很麻烦,这里讲一种更好用的日志输出方式,使用 lombok
来更简单的输出。
1.
添加
lombok
框架支持。
2.
使用
@slf4j
注解输出日志。
6.1 添加 lombok 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
6.2 输出日志
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {
@RequestMapping("/log")
public void loggerTest() {
log.error("------------------- error -----------------");
}
}
6.3 lombok 原理解释
lombok
能够打印日志的密码就在
target
目录里面,
target
为项目最终执行的代码,查看
target
目录如下:
![](https://i-blog.csdnimg.cn/blog_migrate/1dc89754e4909fd8d9abc8acbb185b68.png)
Java 程序的运行原理:
Lombok 的作用如下图所示:
6.4 lombok 更多注解说明
基本注解
组合注解
日志注解
总结
日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,
Spring Boot
内容了日志框架,默认情况下使用的是 info
日志级别将日志输出到控制台的,我们可以通过
lombok
提供的
@Slf4j
注解和 log
对象快速的打印自定义日志,日志包含
6
个级别:
- trace:微量,少许的意思,级别最低;info:普通的打印信息;
- debug:需要调试时候的关键信息打印;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。
日志级别依次提升,而日志界别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。