在以前,使用显示调用的日志记录器,比如:
Logger logger = Logger.getLogger(ChangeLogLevel.class);
logger.setLevel(org.apache.log4j.Level.DEBUG);
这种方式是可以很方便的将日志的级别在运行时进行动态调整,但在Springboot里,我们舍弃了这种很low的方式,采用了注解方式(@Slf4j)去创建日志记录器,但Slf4j的Logger并没有提供显示修改Level的方法,所以需要我们自己去探索
slf4j是一个日志框架,在应用初始化时,它会绑定到具体的日志实现框架里,如Log4j、Logback或Log4j2等
我们系统使用的日志框架是 Log4j,因此基于Log4j实现日志级别的动态调整
实现效果如下:
核心代码只有一段逻辑,通过 LoggerContext 的静态方法获取到一个 LoggerContext,在通过记录器上下文获取到记录器对象,对记录器的日志级别进行设置
public static void main(String[] args) {
String wantLevel = "DEBUG";
log.error("error");
log.warn("warn");
log.info("info");
log.debug("debug non display");
System.out.println("log>" + log);
System.out.println(log.isDebugEnabled());
LoggerContext logContext = LoggerContext.getContext(false);
logContext.getLogger(ChangeLogLevel.class.getName()).setLevel(Level.getLevel(wantLevel));
System.out.println(log.isDebugEnabled());
log.debug("debug will display");
System.out.println("log>" + log);
}
演示的只是一个main方法,能快速说明问题,可以将该逻辑放到 Controller 中,通过http等方法进行调用设置
/**
* @param className 类名,需全路径
* @param wantLevel 等级 DEBUG/INFO/...
*/
@GetMapping("/change/{className}/{wantLevel}")
public String getSiteScoreInfo(@PathVariable String className, @PathVariable String wantLevel) {
LoggerContext logContext = LoggerContext.getContext(false);
logContext.getLogger(className).setLevel(Level.getLevel(wantLevel));
return className + " change " + wantLevel ;
}