在以前,使用顯示調(diào)用的日志記錄器,比如:
Logger logger = Logger.getLogger(ChangeLogLevel.class);
logger.setLevel(org.apache.log4j.Level.DEBUG);
這種方式是可以很方便的將日志的級(jí)別在運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)調(diào)整,但在Springboot里,我們舍棄了這種很low的方式,采用了注解方式(@Slf4j)去創(chuàng)建日志記錄器,但Slf4j的Logger并沒(méi)有提供顯示修改Level的方法,所以需要我們自己去探索
slf4j是一個(gè)日志框架,在應(yīng)用初始化時(shí),它會(huì)綁定到具體的日志實(shí)現(xiàn)框架里,如Log4j、Logback或Log4j2等
我們系統(tǒng)使用的日志框架是 Log4j,因此基于Log4j實(shí)現(xiàn)日志級(jí)別的動(dòng)態(tài)調(diào)整
實(shí)現(xiàn)效果如下:

動(dòng)態(tài)調(diào)整日志級(jí)別示例
核心代碼只有一段邏輯,通過(guò) LoggerContext 的靜態(tài)方法獲取到一個(gè) LoggerContext,在通過(guò)記錄器上下文獲取到記錄器對(duì)象,對(duì)記錄器的日志級(jí)別進(jìn)行設(shè)置
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);
}
演示的只是一個(gè)main方法,能快速說(shuō)明問(wèn)題,可以將該邏輯放到 Controller 中,通過(guò)http等方法進(jìn)行調(diào)用設(shè)置
/**
* @param className 類名,需全路徑
* @param wantLevel 等級(jí) 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 ;
}