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