前言

在日常工作中,我们为了方便定位问题通常都会打印日志,在开发、测试和生产环境中,日志级别可能都不一样,而在自己开发的过程中为了方便调试可能会打印很多日志,但是生产中为了性能这些日志我们可能需要删掉,只保留一些必要的日志

Log4j 定义了 8 个日志级别,其中的日志级别优先级从高到低为:

  • OFF
  • FATAL
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • TRACE
  • ALL

Spring Boot@1.5 版本开始,Spring Boot Actuator 组件就提供了动态修改日志级别的能力

本篇文章讲下如何动态的修改日志的级别,不用重启项目直接给日志降级或者升级 👏

正式开始

首先创建一个 Spring Boot 项目

添加依赖(pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

</dependencies>

new 一个测试类(cn.imzjw.log.controller.LogController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package cn.imzjw.log.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogController {

private static final Logger LOGGER = LoggerFactory.getLogger(LogController.class);

@GetMapping("/log")
public String simple() {
LOGGER.debug("output debug log...");
return "debug";
}
}

application.yml

1
2
3
4
5
management:
endpoints:
web:
exposure:
include: 'loggers'

测试

/loggers 接口提供了查看以及修改日志级别的能力

在浏览器打开 http://localhost:8080/actuator/loggers 查看当前应用所有包和类的日志级别

img

那么如何查看指定包和类的日志呢?

浏览器打开 http://localhost:8080/actuator/loggers/cn.imzjw.log.controller.LogController

注意替换成自己的包名以及类名

结果可以看出我们的日志级别是 INFO

1
2
3
4
{
"configuredLevel": null,
"effectiveLevel": "INFO"
}

修改日志级别

在我们的测试类中的接口,打印了一条 LOGGER.debug("output debug log..."); 而上面的结果显示我们的日志级别是 INFO,所以这个 DEBUG 日志是不会打印的,不信我们测试一下

img

img

不管我怎么请求这个接口,控制台依然没打印这个日志

下面我们就把这个日志级别修改成 DEBUG 级别

你可以使用 Postman 工具,也可以直接使用命令行的方式,不管用啥,只要能请求到就行

这里我懒得打开 Postman 了,就直接用命令行的方式了

1
2
3
curl -X POST http://localhost:8080/actuator/loggers/cn.imzjw.log.controller.LogController \
-H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8" \
--data '{"configuredLevel":"debug"}'

img

然后浏览器打开访问 http://localhost:8080/actuator/loggers/cn.imzjw.log.controller.LogController 注意换成自己的包名类名

可以发现是 DEBUG 级别了

img

这个时候我们再来访问那个 LogController,可以发现控制台成功打印 DEBUG 日志了

img

注:上面是使用了 Postmancurl 的方式修改日志级别,这些方式都不适用于生产环境,因为很麻烦,容易出错

一般我们可以使用 Spring Boot Admin 可视化修改日志级别,这个可以自己研究,又或者改天我水一篇 Spring Boot Admin

告辞!!!