使用ch.qos.logback可调整log的输出等级
可以方便线上生产环境输出debug级别的日志定位问题
在线上环境稳定的时候又可以调整成info等级避免日志杂乱
具体做法示例如下
package log.test;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
/**
* @author xxx
* @date 2020-11-19
*/
@Slf4j
public class Main {
public static void main(String... a) {
String targetNamespace = "log.test";
log.debug("aaaaaaaaaa");
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = loggerContext.getLogger(targetNamespace);
logger.setLevel(Level.valueOf("INFO"));
log.debug("bbbbbbbbbb");
logger.setLevel(Level.valueOf("DEBUG"));
log.debug("cccccccccc");
}
}
最后输出结果只有a和c,目标达成
在线上环境可以直接做一个switch debug的api接口
调用接口来控制日志等级
@RequestMapping(value = "/switchDebug", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<CommonResponse> switchDebug(
@RequestParam(value = "targetNameSpace", required = true) String targetNameSpace,
@RequestParam(value = "enableDebug", required = true) Boolean isEnableDebug
){
CommonResponse commonResponse = new CommonResponse();
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = loggerContext.getLogger(targetNameSpace);
if(logger!=null){
String level = isEnableDebug?"DEBUG":"INFO";
logger.setLevel(Level.valueOf(level));
ResponseUtils.setRtnAndMessage(commonResponse, ErrorCodeMessage.SERVER_SUCC);
}else {
ResponseUtils.setRtnAndMessage(commonResponse, ErrorCodeMessage.SYSTEM_UNEXPECTED_ERROR);
}
return ResponseEntity.ok(commonResponse);
}