背景
在日常開發中,我們會發布一個又一個的版本交給測試進行測試,又或者運行在線上,如果出了問題,通過日志記錄來定位問題,是一項必不可少的手段,一般我們都會部署一個日志服務,如果日志級別太低,則大量的日志消息會沖擊日志服務器。如果日志級別太高,則有些低級別的日志我們又看不到。那我們不可能每次都通過手動修改配置文件,來達到修改日志級別的目的。那么有什么方法可以線上修改日志級別嗎?
代碼展示
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;
}
}