springboot使用Log4j动态改变某一个日志级别,无需重新启动程序:
public class PackageLogLevelInfo {
@ApiModelProperty(value = "某个包路径日志级别(优先级从高到低依次为:OFF/FATAL/ERROR/WARN/INFO/DEBUG/TRACE/ALL)")
private String singleLevel;
@ApiModelProperty(value = "需要单独设置日志输出级别的类的全限定名(例:org.springframework)")
private String singlePath;
}
public class LogLevelInfo {
@ApiModelProperty(value = "包路徑日志級別信息")
private List<PackageLogLevelInfo> packageLogLevelInfos;
}
public final class LogUtil extends SuperController {
public static void changeServiceLog(@NonNull LogLevelInfo logLevelInfo) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
logLevelInfo.getPackageLogLevelInfos().forEach(packageLogLevelInfo -> {
if (!StringUtils.isEmpty(packageLogLevelInfo.getSingleLevel())
&& !StringUtils.isEmpty(packageLogLevelInfo.getSinglePath())) {
//设置某个类日志级别-可以实现定向日志级别调整
ch.qos.logback.classic.Logger vLogger = loggerContext.getLogger(packageLogLevelInfo.getSinglePath());
if (vLogger != null) {
vLogger.setLevel(Level.toLevel(packageLogLevelInfo.getSingleLevel()));
}
}
});
}
}
public class SysLogRestController extends SuperController {
@ApiOperation("修改日志级别")
@PostMapping("/changeLogLevel")
public ApiResponses<Void> changeLogLevel(@RequestBody LogLevelInfo logLevelInfo) {
if (logLevelInfo == null
|| logLevelInfo.getPackageLogLevelInfos() == null
|| logLevelInfo.getPackageLogLevelInfos().isEmpty()) {
return ApiResponses.failure(ErrorCode.builder().httpCode
(HttpStatus.BAD_REQUEST.value()).msg("need config log level info").build(), null);
}
LogUtil.changeServiceLog(logLevelInfo);
return success(HttpStatus.OK);
}
}