写点什么

Spring Boot 如何动态修改日志级别

用户头像
万里无云
关注
发布于: 2021 年 01 月 14 日
Spring Boot如何动态修改日志级别

前言


为了减少日志频繁打印带来的性能影响,线上环境设置的日志级别一般都相对较高。而当出现生产问题需要排查的时候,可能需要适当降低日志级别(例如 DEBUG)来打印更多的日志信息帮助定位问题。

传统的做法一般是:

1、配置里修改日志级别

2、重启应用

3、问题复现查看报错日志排查问题


这个过程需要重启应用,比较麻烦,效率较低,而且针对大型在线项目,不可能随便停机重启。那么有没有一种方式在不重启应用的情况下实现动态修改日志级别呢?


下面,让老万教你如何通过 SpringBoot 的 actuator 组件来实现动态修改日志级别。

一、添加依赖


<dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-actuator</artifactId></dependency>
复制代码


二、配置 actuator 暴露的端口


#启用actuator端口management.endpoints.enabled-by-default=fasle#设置actuator的访问根路径,默认是/actuatormanagement.endpoints.web.base-path=/message#启用的端点management.endpoints.web.exposure.include=loggers
复制代码

这里我修改了 actuator 的默认访问路径/actuator,改为/message,为的是和项目的基础访问路径保存一致。


启用端口的 2 中配置方法:

方式一:(推荐)

management.endpoints.web.exposure.include=loggers


方式二:(这种方式测试没有生效)

management.endpoint.loggers.enabled=true


补充:如何禁用 info 端口

management.endpoints.enabled-by-default=false

management.endpoint.info.enabled=true


关于 actuator 组件被称为 spring boot 的 4 大组件之一,功能强大,大家在网上自己找些资料进一步了解。


actuator 的 endpoint 端口说明:


如果使用 web 应用(Spring MVC, Spring WebFlux, 或者 Jersey),你还可以使用以下端点:


要更改公开哪些端点,请使用以下技术特定的 include 和 exclude 属性:


include 属性列出了公开的端点的 ID,

exclude 属性列出了不应该公开的端点的 ID

exclude 属性优先于 include 属性。包含和排除属性都可以使用端点 ID 列表进行配置。

*可以用来选择所有端点。

例如,要通过 HTTP 公开除 env 和 beans 端点之外的所有内容,请使用以下属性:


management.endpoints.web.exposure.include=*management.endpoints.web.exposure.exclude=env,beans
复制代码


三、关闭鉴权

一般我们会将 actuator 和 spring security 鉴权组件结合使用,防止这些功能端口被随便调用。由于这里是功能演示,先放开 actuator 相关端口的权限认证。


此外,如果存在 Spring Security,则需要添加自定义安全配置,以允许对端点进行未经身份验证的访问,如以下示例所示:

放开所有 Endpoint 端点进行匹配

@Configurationpublic class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Overrideprotected void configure(HttpSecurity http) throws Exception {    http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()    .anyRequest().permitAll()}
}
复制代码


四、通过/loggers 端口查看日志级别

请求链接:http://localhost:8090/message/loggers

注意上面我说过的,我调整了 management.endpoints.web.base-path=/message。如果没有设置此参数,则使用默认的/actuator 去访问。


五、发起 http 请求修改日志级别

这里演示,修改目录 com.wxswj.provider.message.controller 的日志级别为 debug

请求类型为 POST,参数格式是 JSON

curl -H "Content-Type: application/json" -X POST --data '{    "configuredLevel": "DEBUG"}' http://localhost:8090/message/loggers/com.wxswj.provider.message.controller
复制代码

大家可以在服务器上通过 curl 发起 http 请求,或者通过 Postman 发起请求。

curl -H "Content-Type: application/json" -X POST --data '{"configuredLevel": "DEBUG"}' http://localhost:8090/loggers/com.wxswj.provider.message.controller
复制代码


六、查询日志级别修改结果

http://localhost:8090/message/loggers/com.wxswj.provider.message.controller


{"configuredLevel": "DEBUG","effectiveLevel": "DEBUG"}
复制代码

说明我们的修改日志级别的请求生效。


总结

通过整合 spring boot 的 actuator 组件,公开对应的/loggers 端口,我们就可以轻松的实现动态调整系统的日志级别,而不用项目重启。


更多精彩,关注我吧。


发布于: 2021 年 01 月 14 日阅读数: 27
用户头像

万里无云

关注

微服务,分布式,中间件 2018.08.14 加入

热衷技术,乐于分享,欢迎关注,一起前行。

评论

发布
暂无评论
Spring Boot如何动态修改日志级别