生产环境中经常有需要动态修改日志级别。 现在就介绍几种方案
方案一:开启logback的自动扫描更新
配置如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- configuration标签 scan属性代表logback框架会定时检测改配置文件是否有发生改动,如果有则更新为最新配置-->
然后就将修改的配置文件拷贝到app.jar的同级目录下config/logback.xml
方案二:自定义api
代码如下
package com.example.mybatiesdemo.controller;import ch.qos.logback.classic.Logger;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.example.mybatiesdemo.config.HyposensitizationExecutor;
import com.example.mybatiesdemo.dto.BsBonusSalesEo;
import com.example.mybatiesdemo.im.service.IMServiceDemo2;
import com.example.mybatiesdemo.mapper.UserMapper;
import com.example.mybatiesdemo.ocr.ocrService.utlis.SocrService;
import com.example.mybatiesdemo.retry.spring.MyRetryService;
import org.apache.tika.Tika;
import org.junit.jupiter.api.Test;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;/**** @Author : Wukn* @Date : 2024/4/26*/
@RestController
@RequestMapping(value = "/log")
public class LogBackController {/*** logback动态修改包名的日志级别* @param level 日志级别* @param packageName 包名* @return 当前的日志级别* @throws Exception*/@RequestMapping(value = "/setlevel")public String updateLogbackLevel( @RequestParam(value="level") String level,@RequestParam(value="packageName",defaultValue = "-1") String packageName) throws Exception {ch.qos.logback.classic.LoggerContext loggerContext =(ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();Logger logger= null;if(packageName.equals("-1")) {// 默认值-1,更改全局日志级别;否则按传递的包名或类名修改日志级别。logger= loggerContext.getLogger("root");} else {logger= loggerContext.getLogger(packageName);}logger.setLevel(ch.qos.logback.classic.Level.toLevel(level));return logger.getLevel().levelStr;}}
方案三:springboot引入Actuator
1、pom.xml增加相关依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.4.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
1、配置文件中增加配置 如果是springboot1.X,
management.security.enabled=false
如果是springboot2.X,则参考如下配置
management:endpoint:health:show-details: "ALWAYS"endpoints:web:exposure:include: "*"
3、查看级别 我们可以发送GET 请求到
http://localhost:8080/actuator/loggers 来获取支持的日志等级,以及系统(ROOT)默认的日志等和各个包路径(com.xxx.aa等)对应的日志级别。
访问会返回所有的类的日志级别信息。
4、修改日志级别 通过
http://localhost:8080/actuator/loggers 端点提供的 POST 请求,修改包路径com.xxx.aa的日志级别为DEBUG:
发送POST 请求到
http://localhost:8080/actuator/loggers/com.xxx.aa,其中请求 Body 的内容如下:
{
"configuredLevel": "DEBUG"
}
再用GET 访问
http://localhost:8080/loggers/com.xxx.aa查看当前的日志级别:
{
configuredLevel: "DEBUG",
effectiveLevel: "INFO"
}
方案四 集成springcloudadmin来动态修改配置
springcloudadmin安装部署我就不做描述了,网上很多。 1、引入admin依赖
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
2、登录springcloudadmin,找到指定的服务中某一个节点
在这里插入图片描述
然后点击左边日期,进入控制台,如下
在这里插入图片描述
这样就能动态修改了,操作比较方便。
总结
在条件允许的情况下建议使用方案四