添加依赖
<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
查看指定包或类的详情
http://<ip>:<port>/actuator/loggers/org.springframework.data
修改日志级别
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"}'
原理分析
Actuator有约定, /actuator 下端点的定义代码在
xxxEndpoint
中
- 找到
loggers
端点实现类
- Spring Boot2 注解
@Endpoint
用来描述Spring Boot Actuator的端点,这样就会产生一个/actuator/loggers
的路径,它类似于Spring MVC的 @RequestMapping("loggers")
@ReadOperation
类似 @GetMapping
@WriteOperation
类似 @PostMapping
@DeleteOperation
类似 @DeleteMapping
@Selector
类似 @PathVariable
- 如果动态修改级别
从上图可知,主要通过configureLogLevel
来修改配置,去除判断,主要看核心方法
this.loggingSystem.setLogLevel(name, configuredLevel);
当前方法的实现类有:
SpringBoot默认使用的是Logback,Logback实现方式如下:
Log4J2实现方式如下:
每种log框架实现方式各不相同,SpringBoot统一接口来实现再不同框架中实现的动态修改。
- Logback 动态修改
在初始化的时候,把已使用的类、方法用map保存全部,做logger缓存,存在直接返回,不存在,则加载当前包到类到方法的每一级logger,用synchronized
锁住ROOT
的logger,已保证同步。下贴关键方法图:
loggerCache
存在直接返回
不存在加载,保存到loggerCache
后返回。
最后使用 logback
的Logger.setLevel
方法,设置级别。
完。
本文截图与方法使用的版本为:
2.2.7.RELEASE