Spring Boot 通过 actuator 动态修改日志级别

添加依赖

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

添加暴露端点配置

management:
  endpoints:
    web:
      exposure:
        include: "loggers"   
# "*"表示暴露索引,这里只需要暴露"loggers"端点即可

访问端点数据

curl http://<ip>:<port>/actuator/loggers

image.png

查看指定包或类的详情

http://<ip>:<port>/actuator/loggers/org.springframework.data

image.png

修改日志级别

curl -X POST http://<ip>:<port>/actuator/loggers/org.springframework.data -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8" --data '{"configuredLevel":"debug"}'

image.png

原理分析

Actuator有约定, /actuator 下端点的定义代码在 xxxEndpoint

  • 找到loggers端点实现类

image.png

  • Spring Boot2 注解

image.png
@Endpoint用来描述Spring Boot Actuator的端点,这样就会产生一个/actuator/loggers 的路径,它类似于Spring MVC的 @RequestMapping("loggers")

image.png
image.png
@ReadOperation 类似 @GetMapping
@WriteOperation 类似 @PostMapping
@DeleteOperation 类似 @DeleteMapping
@Selector 类似 @PathVariable

  • 如果动态修改级别

从上图可知,主要通过configureLogLevel来修改配置,去除判断,主要看核心方法

this.loggingSystem.setLogLevel(name, configuredLevel);

当前方法的实现类有:
image.png

SpringBoot默认使用的是Logback,Logback实现方式如下:

image.png

Log4J2实现方式如下:
image.png

每种log框架实现方式各不相同,SpringBoot统一接口来实现再不同框架中实现的动态修改。

  • Logback 动态修改

在初始化的时候,把已使用的类、方法用map保存全部,做logger缓存,存在直接返回,不存在,则加载当前包到类到方法的每一级logger,用synchronized锁住ROOT的logger,已保证同步。下贴关键方法图:

image.png
loggerCache存在直接返回
image.png
不存在加载,保存到loggerCache后返回。

最后使用 logbackLogger.setLevel方法,设置级别。

完。

本文截图与方法使用的版本为:2.2.7.RELEASE
image.png

参考