一、前提:
本人使用的 log4j2 + slf4j 的日志框架,在pom.xml中添加依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Remove Spring Boot Default Logback Dependency -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 log4j2 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.7.2</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
二、动态修改日志级别的两种方式
方式一:调用接口
/**
* 动态修改业务类 Logger Level
*
* @param classNames 类名,需全路径, 支持设置多个
* @param level 期望级别 DEBUG/INFO/...
*/
@GetMapping("/loggers")
public BaseResult getSiteScoreInfo(@RequestParam(value = "className", required = false) List<String> classNames,
@RequestParam(required = false) String level) {
if (CollectionUtils.isEmpty(classNames)) {
return getLoggers();
}
return getLoggerNextLevel(classNames, level);
}
/**
* 日志级别动态调整
* 当级别为空时,INFO/DEBUG 级别间切换
* @param classNames 指定类名
* @param level 期望日志级别
* @return
*/
private BaseResult getLoggerNextLevel(List<String> classNames, String level) {
LoggerContext logContext = LoggerContext.getContext(false);
/** className 参数包含 “ALL” 则为所有业务类设置日志级别 **/
boolean setAllClass = classNames.stream().anyMatch(t -> "ALL".equalsIgnoreCase(t));
if (setAllClass) {
classNames = logContext.getLoggers().stream().filter(logger -> logger.getName().startsWith("com.xxx"))
.map(Logger::getName).collect(Collectors.toList());
}
Level nextLevel;
if (StringUtils.isEmpty(level)) {
nextLevel = Objects.equals(Level.INFO, logContext.getLogger(classNames.get(0)).getLevel()) ? Level.DEBUG : Level.INFO;
} else {
level = level.toUpperCase();
nextLevel = Level.getLevel(level);
}
List levelInfos = new ArrayList(classNames.size());
classNames.forEach(c -> {
logContext.getLogger(c).setLevel(nextLevel);
Map info = new HashMap(16);
info.put("className", c);
info.put("level", nextLevel.getStandardLevel());
levelInfos.add(info);
});
return BaseResult.success(ResultEnum.SUCCESS, levelInfos);
}
/**
* 获取所有 Loggers
*
* @return
*/
private BaseResult getLoggers() {
LoggerContext logContext = LoggerContext.getContext(false);
Collection<Logger> loggers = logContext.getLoggers();
List<Map> collect = loggers.stream().filter(logger -> logger.getName().startsWith("com.xxx"))
.map(logger -> {
Map loggerLevel = new HashMap(16);
loggerLevel.put("className", logger.getName());
loggerLevel.put("level", logger.getLevel().getStandardLevel().toString());
return loggerLevel;
}).collect(Collectors.toList());
return BaseResult.success(ResultEnum.SUCCESS, collect);
}
}
调用以下接口URL:
http://192.168.1.26:8089/XM/debug/loggers?className=com.xxx.service.common.CommonService&level=info
方式二:通过Arthas动态修改
-
下载Arthas的工具包:arthas-packaging-3.5.0-bin.zip
-
工具包上传到linux服务器宿主机上,使用docker cp命令拷贝到容器内部
docker cp /root/arthas-packaging-3.5.0-bin.zip 容器名:/home
-
解压缩后启动Arthas服务
进入容器: docker exec -it 容器ID /bin/bash
进入压缩包所在目录:cd /home
unzip arthas-packaging-3.5.0-bin.zip
启动:java -jar arthas-boot.jar
找到需要修改日志级别的类:sc -d *TestService
确认类的日志级别:logger -c 3dddf45g
修改类的日志级别:logger -c 3dddf45g --name root --level debug