SpringBoot项目运行时动态修改Logback日志级别


背景

在日常开发中,我们会发布一个又一个的版本交给测试进行测试,又或者运行在线上,如果出了问题,通过日志记录来定位问题,是一项必不可少的手段,一般我们都会部署一个日志服务,如果日志级别太低,则大量的日志消息会冲击日志服务器。如果日志级别太高,则有些低级别的日志我们又看不到。那我们不可能每次都通过手动修改配置文件,来达到修改日志级别的目的。那么有什么方法可以线上修改日志级别吗?

代码展示

package com.sunyiwei.logdemo.controller;

import ch.qos.logback.classic.LoggerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 临时修改日志级别的
 */
@RequestMapping("/api/log")
@RestController
public class LogbackController {

    /**
     * logback动态修改包名的日志级别
     *
     * @param level  日志级别
     * @param packageName 包名
     * @return 当前的日志级别
     * @throws Exception
     */
    @GetMapping(value = "/setLevel")
    public String updateLogbackLevel(@RequestParam(value = "level") String level,
                                     @RequestParam(value = "packageName", defaultValue = "-1") String packageName) throws Exception {
        LoggerContext loggerContext = (ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();

        Logger logger = null;
        if (packageName.equals("-1")) {
            // 默认值-1,更改全局日志级别;否则按传递的包名或类名修改日志级别。
            logger = loggerContext.getLogger("root");

        } else {
            logger = loggerContext.getLogger(packageName);
        }
        ((ch.qos.logback.classic.Logger) logger).setLevel(ch.qos.logback.classic.Level.toLevel(level));
        return ((ch.qos.logback.classic.Logger) logger).getLevel().levelStr;
    }

    /**
     * 获取当前日志级别
     */
    @GetMapping(value = "/getLevel")
    public String getLogbackLevel(@RequestParam(value = "packageName", defaultValue = "-1") String packageName) throws Exception {
        LoggerContext loggerContext = (ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();

        Logger logger = null;
        if (packageName.equals("-1")) {
            // 默认值-1,更改全局日志级别;否则按传递的包名或类名修改日志级别。
            logger = loggerContext.getLogger("root");

        } else {
            logger = loggerContext.getLogger(packageName);
        }
        return ((ch.qos.logback.classic.Logger) logger).getLevel().levelStr;
    }

}

接口测试

获取当前日志级别

获取当前日志级别

设置日志级别

设置日志级别


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM