SpringBoot动态修改日志级别的操作
作者:斗者_2013 发布时间:2022-10-31 05:00:30
前言
为了减少日志频繁打印带来的性能影响,线上环境设置的日志级别一般都相对较高。而当出现生产问题需要排查的时候,可能需要适当降低日志级别(例如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的访问根路径,默认是/actuator
management.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端口说明:
ID | 描述 | 默认启用 |
---|---|---|
auditevents | 显示当前应用程序的审计事件信息 | Yes |
beans | 显示一个应用中所有Spring Beans的完整列表 | Yes |
conditions | 显示配置类和自动配置类(configuration and auto-configuration classes)的状态及它们被应用或未被应用的原因 | Yes |
configprops | 显示一个所有@ConfigurationProperties的集合列表 | Yes |
env | 显示来自Spring的 ConfigurableEnvironment的属性 | Yes |
flyway | 显示数据库迁移路径,如果有的话 | Yes |
health | 显示应用的健康信息(当使用一个未认证连接访问时显示一个简单的'status',使用认证连接访问则显示全部信息详情) | Yes |
info | 显示任意的应用信息 | Yes |
liquibase | 展示任何Liquibase数据库迁移路径,如果有的话 | Yes |
metrics | 展示当前应用的metrics信息 | Yes |
mappings | 显示一个所有@RequestMapping路径的集合列表 | Yes |
scheduledtasks | 显示应用程序中的计划任务 | Yes |
sessions | 允许从Spring会话支持的会话存储中检索和删除(retrieval and deletion)用户会话。使用Spring Session对反应性Web应用程序的支持时不可用。 | Yes |
shutdown | 允许应用以优雅的方式关闭(默认情况下不启用) | No |
threaddump | 执行一个线程dump | Yes |
如果使用web应用(Spring MVC, Spring WebFlux, 或者 Jersey),你还可以使用以下端点:
ID | 描述 | 默认启用 |
---|---|---|
heapdum | 返回一个GZip压缩的hprof堆dump文件 | Yes |
jolokia | 通过HTTP暴露JMX beans(当Jolokia在类路径上时,WebFlux不可用) | Yes |
logfile | 返回日志文件内容(如果设置了logging.file或logging.path属性的话),支持使用HTTP Range头接收日志文件内容的部分信息 | Yes |
prometheus | 以可以被Prometheus服务器抓取的格式显示metrics信息 | Yes |
要更改公开哪些端点,请使用以下技术特定的include和exclude属性:
Property | Default |
---|---|
management.endpoints.jmx.exposure.exclude | * |
management.endpoints.jmx.exposure.include | * |
management.endpoints.web.exposure.exclude | * |
management.endpoints.web.exposure.include | info, health |
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端点进行匹配
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected 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"
}
说明我们的修改日志级别的请求生效。
来源:https://laowan.blog.csdn.net/article/details/112639323
猜你喜欢
- 简介mutable(可变)和immutable(不可变)对象是我们在java程序编写的过程中经常会使用到的。可变类型对象就是说,对象在创建之
- 身为程序员我们对线程是再熟悉不过了,多线程并发算是Java进阶的知识,用好多线程不容易有太多的坑。创建线程也算是一个"重"
- Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "hello";,另一种就是使用new
- 概念尽量使用合成/聚合,而不是使用继承实现复用。所谓的合成/聚合是指一个对象里持有另外一个类的对象,通过调用这些对象的方法得到复用已有功能的
- SpringBoot2底层注解一、@ImportResource@Conditional注解,是根据条件进行装配。满足了 Condition
- 现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80
- @RequestBody部分属性丢失问题描述JavaBean实现public class VerifyNewFriendApplyReq i
- 1.过滤器 (Filter)过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看
- 序言在flutter开发中,我们使用 bloc 框架,基于状态变更进行响应式开发。本篇文章,小轰将 bloc 核心业务块进行拆解简化,聊一聊
- 一、引言使用原生的zookeeper时候会遇到watcher一次注册生效一次等情况,因此使用curatorcurator是Netflix公司
- 已知一副扑克牌有54张,去除大王和小王,剩余52张。在其中随机抽取4张牌,利用加减乘除进行计算得到24. 从A到10,他们的值分别为1到10
- springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件先
- 一、判断一个字符串str不为空的方法有:1、str == null;2、"".equals(str);3、str.len
- 如何配置 * step1: 自定义 * /** * 自定义 * */public class MyInterceptor implemen
- sidebarDepth: 3条件构造器说明以下出现的第一个入参boolean condition表示该条件是否加入最后生成的SQL中,例如
- 对某个类型中的方法进行拦截,然后加入固定的业务逻辑,这是AOP面向切面编程可以做的事,在springboot里实现aop的方法也有很多, s
- JAVA JNI函数的注册过程详细介绍我们在java中调用Native code的时候,一般是通过JNI来实现的,我们只需要在java类中加
- 前言MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手
- 一、安装Maven下载地址:https://maven.apache.org/download.cgi把下载的安装包解压tar -xvf a
- Spring Security 过滤器链及自定义Filter别名类名称Namespace Element or AttributeCHANN