平时项目记录日志记录打印SQL,打印MQ日志,日志量比较大,一般用INFO,但是项目刚上线,不太稳定一般需要用DEBUG记录详细日志,或者由于项目出现问题,需要调整到DEBUG,查看详情,所以需要支持动态调整日志级别.
1.配置logback-spring.xml
2.配置application.yml
3.配置apollo参数
4编写apollo变化触发类
5.编写日志测试类
6.测试
1.配置logback-spring.xml
配置日志级别log.level ,参数log.level.com.sun.springboot来源于apollo参数
配置logger,日志级别来自上面定义的参数log.level
2.配置application.yml
apollo:
bootstrap:
#在应用启动阶段是否向Spring容器注入被托管的properties文件配置信息
enabled: true
eagerLoad:
#将Apollo配置加载提到初始化日志系统之前
enabled: true
3.配置apollo参数
log.level.com.sun.springboot info
4编写apollo变化触发类
package com.sun.springboot.controller;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 自动刷新apollo配置
*/
@Slf4j
@Component
public class LogLevelChanged implements ApplicationContextAware {
private Logger logger = LoggerFactory.getLogger(LogLevelChanged.class);
private ApplicationContext applicationContext;
private String prefix = "log.level.";
@ApolloConfigChangeListener(value = {"application"})
public void onChange(ConfigChangeEvent changeEvent) {
log.info("================Apollo 自动刷新值 开始 ===========================");
Map
for (String changeKey : changeEvent.changedKeys()) {
changeKey = changeKey.trim();
ConfigChange configChange = changeEvent.getChange(changeKey);
String oldValue = configChange.getOldValue();
String newValue = configChange.getNewValue();
if (changeKey.startsWith(prefix)) {
logMap.put(changeKey.substring(prefix.length()), newValue);
} else {
continue;
}
log.info("changedKey:【{}】,oldValue=【{}】, newValue:【{}】", changeKey,
oldValue, newValue);
}
changeLogLevel(logMap);
log.info("================Apollo 自动刷新值 结束 ===========================");
}
private void changeLogLevel(Map
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
for (String key : logMap.keySet()) {
ch.qos.logback.classic.Logger logbackLogger = lc.getLogger(key);
logbackLogger.setLevel(Level.toLevel(logMap.get(key)));
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
5.编写日志测试类
package com.sun.springboot.controller; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Objects; @RestController @RequestMapping(value = "log") public class LogController { private static Logger logger = LoggerFactory.getLogger(LogController.class); /** * 获得日志所在包的日志级别 * * @param pack 所在包的日志级别 * @return */ @RequestMapping(value = "getLevel") public String getLevel(String pack) { Logger logger = LoggerFactory.getLogger(LogController.class); // 第一步:获取日志上下文 LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); // 第二步:获取日志对象 (日志是有继承关系的,关闭上层,下层如果没有特殊说明也会关闭) ch.qos.logback.classic.Logger log = lc.getLogger(pack); Level level = log.getLevel(); String result = ""; if (Objects.isNull(level)) { result = String.format("package:%s,level:%s", pack, "null"); } else { result = String.format("package:%s,level:%s", pack, level.toString()); } // 第三步:修改日志级别 logger.debug("===== 我是 debug ====="); logger.info("===== 我是 info ====="); logger.error("===== 我是 ERROR ====="); return result; } }
6.测试
6.1先修改 log.level.com.sun.springboot 为debug
6.2 访问接口:http://localhost:6012/log/getLevel?pack=com.sun.springboot.controller
返回:package:com.sun.springboot.controller,level:DEBUG
logback-spring.xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${LOG_HOME}/debug/debug.%d{yyyy-MM-dd}.%i.log 16 20MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n DEBUG ${LOG_HOME}/info/info.%d{yyyy-MM-dd}.%i.log 16 20MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n INFO ${LOG_HOME}/warn/warn.%d{yyyy-MM-dd}.%i.log 24 20MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n WARN ${LOG_HOME}/error/error.%d{yyyy-MM-dd}.%i.log 32 20MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ERROR
参考:springboot apollo 自动刷新_重度孤独症患者的博客-CSDN博客
logback java动态配置【动态修改日志级别,动态修改appender】_keep-go-on的博客-CSDN博客_java 动态修改日志级别