背景
应用在线上部署时,一般日志级别会设置为info级别。一些流量高的应用,甚至会设置为error级别。这样日志打的少了,日志文件就不会变的太大,接口的性能也会更高。但缺点也显而易见,出现问题时,由于日志太少,很难定位出问题在哪儿。
今天就介绍一种,可以动态修改日志级别的方法。
需求
我使用一个叫“my_logger”的logger对象输出日志,demo代码如下
private final Logger logger = LoggerFactory.getLogger("my_logger");
@ResponseBody
@RequestMapping(value = "outputLog")
public String outputLog() {
logger.debug("我是debug级别的日志,入参是...");
logger.info("我是info级别的日志...");
logger.debug("我是debug级别的日志,返回值是...");
return "success";
}
此时请求接口,仅输出一条info级别的日志
改造
【重点】新增一个修改日志级别的接口
排查线上问题时,就调用这个接口,入参可以为:ERROR、WARN、INFO、DEBUG、TRACE
@ResponseBody
@PutMapping(value = "level/{logLevel}")
public String changeLogLevel(@PathVariable("logLevel") String logLevel) {
try {
// 1. 获取日志上下文
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
// 2. 修改指定logger对象的日志级别(这里根据你自己的日志名称修改,我的叫"my_logger")
// 如果修改mybatis、spring框架的日志,写"org.mybatis"、"org.springframework"
loggerContext.getLogger("my_logger").setLevel(Level.valueOf(logLevel));
System.out.println("日志级别修改成功!" + logLevel);
} catch (Exception e) {
logger.error("动态修改日志级别出错", e);
return "failure";
}
return "success";
}
比如我现在改成debug级别
结果
这个时候,再请求第一个接口,就可以看到debug级别的日志了。