WEB应用项目生产环境一般日志级别是ERROR级别,但有时候碰到有问题的时候想看一下DEBUG级别的日志,可能需要项目重启,单个项目还好说,像现在微服务的项目动不动就十几个服务根本无从下手,遂研发出在线变更日志级别功能;
1、要变更级别,先清除原来的级别以及LoggerContext对象
String[] LOGGER_NAME = new String[] {"root"};
LoggerContext lc = (LoggerContext) StaticLoggerBinder.getSingleton().getLoggerFactory();
//清除日志
for (String logName : LOGGER_NAME) {
ch.qos.logback.classic.Logger logger = lc.getLogger(logName);
logger.detachAppender("CallLogAppender");
logger.detachAndStopAllAppenders();
logger.isAdditive();
}
2、重新设置日志级别
//这里直接对root目录进行所有级别调整,当然也可以视情况写上自己的目录
String[] LOGGER_NAME = new String[] {"root"};
if (!StringUtils.hasText(level)) {
level = "";
}
level = level.trim();
CallLogAppender ca = new CallLogAppender();
ca.setContext(lc);
ca.setName("CallLogAppender");
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setCharset(UTF_8);
encoder.setPattern("%date %-5level %logger- %msg%n");
encoder.setContext(lc);
encoder.start();
ca.setEncoder(encoder);
ca.start();
for (String logName : LOGGER_NAME) {
Logger logger = lc.getLogger(logName);
switch (level.toUpperCase()) {
case "OFF":
logger.setLevel(Level.OFF);
break;
......其它级别类似以上的写法
default:
logger.setLevel(Level.ERROR);
break;
}
logger.addAppender(ca);
}
3、application.properties日志级别配置
logging.level.root=debug
logging.level.org.apache=info
logging.level.sun.net=info
logging.level.com.alibaba=info
注意:设置root的目录,那么其它路径不要在application.properties进行配置级别,否则会出现调用接口无法变更级别问题;
把第一个方法封装到Controller中,在前台就能直接调用后台接口进行在线级别变更了,当然微服务应用很多,这个可以通过注册中心获取到所有实例进行遍历,这都是小问题了;