工作中,有些场景需要动态修改线上日志记录器的打印日志级别,
本文的两个工具类使用的版本如下:
----------------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 loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
return ctx.getLogger(packageName).getLevel();
// return loggerContext.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 {
//trace --> debug --> info --> warn --> error -->fatal
// LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// ctx.getLogger(packageName).setLevel(Level.valueOf(logLevel));
// ctx.updateLoggers();
// org。 apache.logging.log4j.core.config.Configurator;
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);
//trace --> debug --> info --> warn --> error -->fatal
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 {
        //trace --> debug --> info --> warn --> error -->fatal
        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 {
        //trace --> debug --> info --> warn --> error -->fatal
        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";
    }
}
备注:
  1、logback和log4j2也有其它方式动态修改日志,但需要有方案或权限修改线上部署服务器的修改权限
      比如logback.xml中的configuration标签有<configuration scan="true" scanPeriod="60 seconds" debug="false">这种配置,
  其中的scan如果设置为true的话,项目在启动后就会默认每一分钟自动扫描配置文件,如果有改变则重新加载,而我们还可以设置自动扫描的时间间隔属性scanPeriod,可以设置成30秒或者5分钟。
  现在只要在logback.xml中添加一个属性,以后可以直接在服务器上修改logback.xml中root的level属性或者直接替换整个logback.xml文件,然后过会项目的日志输出级别就会改变了,不需要再重启项目。 
  2、本文主要介绍代码动态修改线上日志级别
原文:https://www.cnblogs.com/xuzhujack/p/12305716.html