Springboot中如何动态修改logback的日志级别?
需求描述:生产上的项目日志级别通过为warn级别,但是有的时候定位问题需要切换到info或者debug级别,通常的情况是修改logback.xml然后重启,但是通过以下方式可以在不用重启t应用(如tomcat)的情况下实现动态控制日志级别,代码如下,通过浏览器访问这个地址即可
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 动态切换日志级别的controller
* @author 江朝技术
*/
@RequestMapping("/api/log")
@RestController
public class LogbackController {
private Logger log = LoggerFactory.getLogger(LogbackController.class);
@RequestMapping(value = "/testlog")
public String logj(){
log.error("我是error");
log.warn("我是warn");
log.info("我是info");
log.debug("我是debug");
return "success";
}
/**
* 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();
if(packageName.equals("-1")) {
// 默认值-1,更改全局日志级别;否则按传递的包名或类名修改日志级别。
loggerContext.getLogger("root").setLevel(ch.qos.logback.classic.Level.toLevel(level));
} else {
loggerContext.getLogger(packageName).setLevel(ch.qos.logback.classic.Level.valueOf(level));
}
return "success";
}
}
网友评论