springboot 1.5.x中的动态切换日志级别

时间:2023-11-14 08:18:44

logback是一套日志框架,由log4j的优化版,由同一个作者开发,在速度和性能上都超过其他日志框架,再结合slf4j,已成为当前最流行的日志框架。

一、springboot中使用logback

springboot中使用logback日志的详细配置说明见:https://blog.csdn.net/appleyk/article/details/78717388

二、springboot中的日志级别动态调整

2.1、Spring Boot 1.5.x中引入的一个新的控制端点:/loggers来管理

Spring Boot 1.5.x中引入的一个新的控制端点:/loggers,该端点将为我们提供动态修改Spring Boot应用日志级别的强大功能。该功能的使用非常简单,它依然延续了Spring Boot自动化配置的实现,所以只需要在引入了spring-boot-starter-actuator依赖的条件下就会自动开启该端点的功能,详细方法见:

http://blog.didispace.com/spring-boot-1-5-x-feature-1/

2.2、通过Logger动态设置

(1)原理

日志框架中有一个工厂类:LoggerFactory,在这个类中可以获取到当前日志的上下文对象LoggerContext,通过LoggerContext可以获取到指定包的Logger ,通过Logger对象那就无所不能了。

引入的jar

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import io.swagger.annotations.Api;

代码:

@RestController("/logconfig")
@Api(value = "LogConfigController", description="LogConfigController")
public class LogConfigController { private static final Logger LOG = LoggerFactory.getLogger(LogConfigController.class); @RequestMapping(value = "/getLoglevel")
public Level getLoglevel(@RequestParam(value = "package") String packageName) throws Exception {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
LOG.trace("trace getLoglevel({})={}", packageName, loggerContext.getLogger(packageName).getLevel());
LOG.debug("debug getLoglevel({})={}", packageName, loggerContext.getLogger(packageName).getLevel());
LOG.info("info getLoglevel({})={}", packageName, loggerContext.getLogger(packageName).getLevel());
LOG.warn("warn getLoglevel({})={}", packageName, loggerContext.getLogger(packageName).getLevel());
return loggerContext.getLogger(packageName).getLevel();
} @RequestMapping(value = "/loglevel/{loglevel}")
public String loglevel(@PathVariable("loglevel") String logLevel,
@RequestParam(value = "package") String packageName) throws Exception {
// trace --> debug --> info --> warn --> error -->fatal
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger(packageName).setLevel(Level.valueOf(logLevel));
return "ok";
}
}
(2)获取当前日志等级getLoglevel():

这里先获取到了LoggerContext,通过loggerContext,获取到了指定包的Logger对象,通过logger对象中的getLevel()方法获取到当前包的日志级别。

访问地址:http://localhost:8080/getLoglevel?package=com.kfit可以看到控制台输出:

{"levelInt":20000,"levelStr":"INFO"}

(3)修改日志等级loglevel()

这里获取到LoggerContext之后,通过getLogger(packageName)获取到logger对象,通过logger对象的setLevel()方法,修改当前包的日志级别。