Spring Boot 动态修改日志级别

背景

服务在生产环境跑,出了点问题,需要 debug 级别的日志;但是平时生产环境谁用 debug,都是用 info 级别。

按一般的流程,改日志级别需要修改文件、重新打包发版,重启是免不了了,但重启可能导致问题不能复现。

现在才知道,日志级别是可以在运行过程中动态修改的。记录下来。

依赖

这个功能有赖于 Spring Boot Actuator。诶,又是你,之前项目中已经有引入的,用来做服务的监控。

如果没有引入,需要在pom.xml中添加

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

配置

然后找一下配置项management.endpoints.web.exposure.include是否存在,如果没有就添加

management.endpoints.web.exposure.include=info,health,loggers

如果有的话,就在原有值里加上loggers即可。

接口

开启了 loggers endpoint,应用启动后就可以访问以下3个接口:

  • GET /actuator/loggers 返回当前应用全部的日志级别信息
  • GET /actuator/loggers/{name} 查看{name}的日志级别
  • POST /actuator/loggers/{name} 修改{name}的日志级别

首先访问第一个接口(http://localhost:8080/actuator/loggers)看一看:

找到loggers部分,我这里返回的是

"loggers": {
    "ROOT": {
        "configuredLevel": "INFO",
        "effectiveLevel": "INFO"
    }
}

表示根节点的日志级别是INFO。(访问http://localhost:8080/actuator/loggers/ROOT也可以看到)

那么要怎么修改呢,调用对应的POST接口即可:

curl -X POST http://localhost:8080/actuator/loggers/ROOT  -H "Content-Type: application/json"  -d "{\"configuredLevel\":\"DEBUG\",\"effectiveLevel\":\"DEBUG\"}"

再次查看GET接口,可以看到已经变为DEBUG级别。

有关原理和其他细节,可以查看以下的参考。

相关参考

  1. Spring Boot 系列(4):日志动态配置详解 – 掘金 (juejin.cn)

发表评论