- 博主简介:想进大厂的打工人
- 博主主页:@xyk:
- 所属专栏: JavaEE进阶
在我们日常的程序开发中,日志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是排除和定位问题。本文会讲解SpringBoot中日志普通用法和基于 lombok 的日志打印~
目录
文章目录
一、日志是什么?
二、日志文件的基本使用
2.1 SpringBoot项目中的日志
2.2 自定义日志打印
三、日志级别
3.1 日志级别的作用
3.2 日志级别的分类
3.3 日志级别的设置
四、日志持久化
五、基于lombok的日志输出
5.1 lombok 日志输出步骤
5.2 简单介绍 lombok 原理
一、日志是什么?
日志是程序的组成部分,日志文件是一种记录计算机系统或者应用程序运行状态和活动的文件。日志文件包含程序中运行的错误,系统的操作人,程序的执行时间,后端代码sql的执行情况等,日志文件可以在本地存储,也可以通过远程服务器进行集中存储和分析。
总的来说,日志就是帮助程序猿来发现问题并定位问题,方便后续的维护和纠错~
二、日志文件的基本使用
2.1 SpringBoot项目中的日志
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
通过上述⽇志信息我们能发现以下 3 个问题:
- Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。
- 默认情况下,输出的⽇志并⾮是开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
- ⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,那么怎么把⽇志永久的保存下来呢?
下面我们来揭秘~
2.2 自定义日志打印
自定义日志打印主要步骤如下:
- 获取日志对象
- 使用日志对象的相关方法输出要打印的内容
获取日志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,代码如下:
// 1. 得到日志对象
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
其中,getLogger方法需要传入当前类,用于说明日志归属类,便于我们更加直观的定位到问题类。同时,需要注意的是,Logger 对象属于 org.slf4j
包下。
使用日志对象打印日志
日志对象的打印方法有很多,示例代码如下:
@RequestMapping("/user")
@Controller
@ResponseBody // 用来设置当前类中所有的方法返回的是数据而非页面
public class UserController {
// 1. 得到日志对象
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/hi")
public String sayHi(){
// 写日志
logger.trace("我是 trace");
logger.debug("我是 debug");
logger.info("我是 info");
logger.warn("我是 warn");
logger.error("我是 error");
return "Hi,Spring Boot";
}
}
实现效果:
可以看到,使用了 5 种不同的方法打印日志信息,一条日志信息包含时间、日志的级别、线程ID、线程名称、日志归属的包和类以及日志的内容。但是这里之所以能打印五条日志,是因为我在配置文件中设置了全局的日志级别;正常情况下,打印出来的只有三种。
三、日志级别
3.1 日志级别的作用
- 日志级别可以帮你筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者信息筛选的时间。
- ⽇志级别可以控制不同环境下,⼀个程序是否需要打印⽇志,如开发环境我们需要很详细的信息,⽽⽣产环境为了保证性能和安全性就会输⼊尽量少的⽇志,⽽通过⽇志的级别就可以实现此需求
3.2 日志级别的分类
日志的级别分为:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认⽇志级别);
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
实际中,我们能自定义的只有前5个,而致命级别的日志,会在代码异常导致程序退出时执行。日志级别的顺序如下图所示:
越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的⽇志了
3.3 日志级别的设置
日志级别的设置,只需要在配置文件中设置 logging.level
配置项即可。(.yml配置文件)
配置根路径的日志级别:
# 日志级别设置
logging:
level:
root: error
可见,全局设置成 error之后,所有的日志都不会出现了,因为日志默认级别为info ~
在根路径日志级别的基础上配置子目录日志级别
logging:
level:
root: error
com:
example:
springbootdemo:
controller: trace
service: info
设置其他的类中,日志是根据自身设置级别来打印的哦~
四、日志持久化
到这里,我们已经了解到如何自定义日志打印以及如何设置日志级别。但是还遗留了一个致命性的问题:日志信息是输出在控制台的,如果重新启动项目,控制台的信息不就消失了吗?有没有什么方法能够将日志信息保存起来,方便以后查看呢?
在生产环境中,我们常常把日志信息保存下来。而将日志信息保存下来的过程就叫做日志持久化。想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后,Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。
配置日志文件的保存路径:
# 设置日志
logging:
file:
path: C:\\logs
配置日志文件的文件名:
# 设置日志
logging:
file:
path: C:\\logs
name: spring-logs
五、基于lombok的日志输出
5.1 lombok 日志输出步骤
每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这⾥讲⼀种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出。
- 添加 lombok 框架⽀持
- 使⽤ @slf4j 注解输出⽇志
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
使⽤ @slf4j 注解输出⽇志:
@Controller
@ResponseBody
@RequestMapping("/art")
@Slf4j
public class ArticleController {
@RequestMapping("/hi")
public String sayHi(){
log.trace("我是 Slf4j trace");
log.debug("我是 Slf4j debug");
log.info("我是 Slf4j info");
return "Hi,Article";
}
}
5.2 简单介绍 lombok 原理
lombok 能够打印⽇志的秘密就在 target ⽬录⾥⾯,target 为项⽬最终执⾏的代码,查看 target ⽬录如下:
可见,@slf4j 注解,实质上就是帮助我们进行了 log 对象的创建,我们只需要使用 log 对象即可~还是很香的把~~
Lombok 在编译期间生成代码,而不是在运行时生成。 Lombok 的使用可以节省开发者在编写 Java 代码时的时间和精力,并且可以让代码更加简洁易懂。