log4j2、log4j和logback动态修改日志级别工具类
工作中,在排查线上问题时,有以下场景在不重新部署或重启服务的情况下,需要动态调整线上日志级别
1、线上有些日志打印过多干扰有用的日志,需要动态修改线上日志记录器的打印日志级别,调高一些日志级别,打印出更少的干扰日志
2、由于线上日志级别打印的相关有用日志太少,需要动态修改线上日志记录器的打印日志级别,调低一些日志级别,打印出更多的有用日志
本文的两个工具类使用的版本如下:
----------------logback---------------------
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.8</version>
</dependency>
-----------------log4j2--------------------
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>1.5.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.7</version>
</dependency>
-----------------Log4j2Controller-------------------------
@Api(tags = "Log4j2Controller",description = "Log4j2控制类")
@RestController
@RequestMapping("/log/control")
public class Log4j2Controller {
private static final Logger logger = LoggerFactory.getLogger(Log4j2Controller.class);
@RequestMapping(value = "/getLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public Level getLoglevel(@RequestParam(value="package") String packageName) throws Exception {//package 指定修改日志级别的包路径 ,如 org.mybatis
logger.info("getLoglevel packageName is {}",packageName);
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
return ctx.getLogger(packageName).getLevel();
}
@RequestMapping(value = "/setLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public String setLoglevel(@RequestParam("loglevel") String logLevel, @RequestParam(value="package") String packageName) throws Exception {
logger.info("setLoglevel packageName is {},logLevel is {}",packageName,logLevel);
try{
Configurator.setLevel(packageName,Level.valueOf(logLevel));
}catch (Exception e){
logger.error("Exception setLoglevel packageName is {},logLevel is {}",packageName,logLevel,e);
return "fail";
}
return "success";
}
@RequestMapping(value = "/setRootLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public String setRootLoglevel(@RequestParam("loglevel") String logLevel) throws Exception {
logger.info("setRootLoglevel ,logLevel is {}",logLevel);
try {
//设置根记录器
Configurator.setRootLevel(Level.valueOf(logLevel));
}catch (Exception e){
logger.error("Exception setRootLoglevel ,logLevel is {}",logLevel,e);
return "fail";
}
return "success";
}
@RequestMapping(value = "/testLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public String testLoglevel() throws Exception {
logger.debug("current log level is debug..........debug...");
logger.info("current log level is info.........info......");
logger.warn("current log level is warn.......warn.......");
logger.error("current log level is error.......error.......");
return "success";
}
}
-----------------LogbackController-------------------------
@Api(tags = "LogbackController",description = "logback控制类")
@RestController
@RequestMapping("/log/control")
public class LogbackController {
private static Logger logger = LoggerFactory.getLogger(LogbackController.class);
@RequestMapping(value = "/getLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public Level getLoglevel(@RequestParam(value="package") String packageName) throws Exception {//package 指定修改日志级别的包路径 ,如 org.mybatis
logger.info("getLoglevel packageName is {}",packageName);
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
return loggerContext.getLogger(packageName).getLevel();
}
@RequestMapping(value = "/setLoglevel", method = {RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public String setLoglevel(@RequestParam("loglevel") String logLevel, @RequestParam(value="package") String packageName) throws Exception {
logger.info("setLoglevel packageName is {},logLevel is {}",packageName,logLevel);
try{
LoggerContext loggerContext =(LoggerContext)LoggerFactory.getILoggerFactory();
loggerContext.getLogger(packageName).setLevel(Level.valueOf(logLevel));
}catch (Exception e){
logger.error("Exception packageName is {},logLevel is {}",packageName,logLevel,e);
return "fail";
}
return "success";
}
@RequestMapping(value = "/setRootLoglevel", method = {RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public String setRootLoglevel(@RequestParam("loglevel") String logLevel) throws Exception {
logger.info("setRootLoglevel ,logLevel is {}",logLevel);
try{
LoggerContext loggerContext =(LoggerContext)LoggerFactory.getILoggerFactory();
//设置全局日志级别
ch.qos.logback.classic.Logger logger=loggerContext.getLogger("root");
logger.setLevel(Level.toLevel(logLevel));
}catch (Exception e){
logger.error("Exception setRootLoglevel,logLevel is {}",logLevel,e);
return "fail";
}
return "success";
}
@RequestMapping(value = "/testLoglevel", method = {RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public String testLoglevel() throws Exception {
logger.debug("current log level is debug..........debug...");
logger.info("current log level is info.........info......");
logger.warn("current log level is warn.......warn.......");
logger.error("current log level is error.......error.......");
return "success";
}
}
-----------------Log4jController-------------------------
@Api(tags = "Log4jController",description = "Log4j控制类")
@Controller
@RequestMapping("/log/control")
public class Log4jController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(Log4jController.class);
@RequestMapping(value = "/getLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public void getLoglevel(@RequestParam(value="package") String packageName,@RequestParam(value="token") String token,HttpServletRequest request, HttpServletResponse response) {
//package 指定修改日志级别的包路径 ,如 org.mybatis
if(validateToken(token,request)==false){
sendJson(response,NO_RIGHT_MSG);
return;
}
logger.info("getLoglevel packageName is {}",packageName);
org.apache.log4j.Logger log = LogManager.getLogger(packageName);
sendJson(response,log.getLevel().toString());;
}
@RequestMapping(value = "/setOneLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public void setOneLoglevel(@RequestParam("loglevel") String logLevel, @RequestParam(value="package") String packageName,@RequestParam(value="token") String token,HttpServletRequest request, HttpServletResponse response) throws Exception {
if(validateToken(token,request)==false){
sendJson(response,NO_RIGHT_MSG);
return;
}
//trace --> debug --> info --> warn --> error -->fatal
logger.info("setOneLoglevel packageName is {},logLevel is {}",packageName,logLevel);
try{
Level level = Level.toLevel(logLevel.toUpperCase());
org.apache.log4j.Logger log = LogManager.getLogger(packageName);
log.setLevel(level);
}catch (Exception e){
logger.error("Exception setLoglevel packageName is "+packageName+",logLevel is "+logLevel,e);
sendJson(response,"fail");
}
sendJson(response,"success");
}
@RequestMapping(value = "/setTwoLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public String setTwoLoglevel(@RequestParam("rootlevel") String rootLevel, @RequestParam("loglevel") String logLevel, @RequestParam(value="package") String packageName,@RequestParam(value="token") String token,HttpServletRequest request, HttpServletResponse response) throws Exception {
if(validateToken(token,request)==false){
sendJson(response,NO_RIGHT_MSG);
return "false";
}
logger.info("setTwoLoglevel packageName is {},rootLevel is {},logLevel is {}",packageName,logLevel);
setRootLoglevel(rootLevel,token,request,response);
setOneLoglevel(logLevel,token,packageName,request,response);
return "success";
}
@RequestMapping(value = "/setRootLoglevel", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json;charset=UTF-8")
public void setRootLoglevel(@RequestParam("loglevel") String logLevel,@RequestParam(value="token") String token,HttpServletRequest request, HttpServletResponse response) throws Exception {
if(validateToken(token,request)==false){
sendJson(response,NO_RIGHT_MSG);
return;
}
logger.info("setRootLoglevel ,logLevel is {}",logLevel);
//all --> trace --> debug --> info --> warn --> error -->fatal --> off
try {
//设置根记录器
org.apache.log4j.Logger log = LogManager.getRootLogger();
log.setLevel(Level.toLevel(logLevel.toUpperCase()));
}catch (Exception e){
logger.error("Exception setRootLoglevel ,logLevel is {}",logLevel,e);
sendJson(response,"fail");
}
sendJson(response,