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