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()方法,修改当前包的日志级别。