动态修改SpringBoot应用的日志级别

背景

线上环境的代码日志输出级别通常都是INFO(SpringBoot的默认日志级别就是INFO),在这个日志级别下只会打印一些非常重要的信息。

但是一旦线上代码出现了Bug,就需要输出在代码中预置好的更详细的日志(使用logger.debug()logger.trace()方法),但是INFO级别下这些调试日志是无法输出的,这个时候就需要将日志级别修改为DEBUGTRACE,痛苦的是线上环境是不太可能允许轻易修改配置并重启的。

我们需要在不重启应用的情况下动态修改日志级别,可以使用Spring Actuator实现这样的需求。

步骤

添加依赖

在pom.xml中添加Spring Actuator依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

暴露服务

在application.properties文件中配置暴露服务访问点:loggers

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

查看日志级别

验证loggers endpoint已经暴露出来:

image-20200915220442600

访问/actuactor/loggers可以查看到全局的日志级别(ROOT元素):

image-20200915220642128

以及按包分类的日志级别(比如me.ningyu.burnerlist):

image-20200915222257905

修改日志级别

发送HTTP POST请求到指定的URL,请求体中的内容为要修改为的日志级别。

  • HTTP URL:http://:/actuator/loggers/,logLevel为ROOT或者具体的包名,比如me.ningyu.burnerlist

  • HTTP Header:application/json

  • HTTP Body

    1
    2
    3
    {
    "configuredLevel": "DEBUG"
    }

可以用你熟悉的Http客户端发送请求:

使用Postman

image-20200915224854486

使用Curl

1
2
3
4
5
curl --location --request POST 'http://localhost:8080/actuator/loggers/me.ningyu.burnerlist' \
--header 'Content-Type: application/json' \
--data-raw '{
"configuredLevel": "DEBUG"
}'

验证

修改前日志级别为INFO:

image-20200915233708529

程序中以debug方法打印日志,但是因为日志级别是INFO,因此不会打印:

image-20200915233833204

通过REST API动态修改日志级别:

image-20200915225719869

修改后日志级别为DEBUG:

image-20200915230647364

这次因为日志级别调整为了DEBUG,程序中以debug方法打印日志就可以打印出来:

image-20200915233034076

备忘

  • 在Spring Boot 2.x中为了安全期间,Actuator只开放了两个服务接入点: /actuator/health/actuator/info,可以通过下面的方法打开所有的监控:

    1
    management.endpoints.web.exposure.include=*
  • 常见的日志级别:

    1
    2
    3
    Fatal > Error > Warn > Info > Debug > Trace

    Off > Error > Warn > Info > Debug > Trace