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

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

 

 
posted on 2014-08-05 09:17  duanxz  阅读(896)  评论(0)    收藏  举报