结合一篇文章实现-定时任务刷新:https://www.jianshu.com/p/b20b7072be42
背景: spring Boot + log4j + 配置中心(公司内部的concrete平台)
整体思路:通过实现定时任务,每秒不停的读取配置中心的日志级别配置,发现有变动,就通过
Level.toLevel(levelValue)
修改日志级别;修改后实时生效;
/**
* 动态修改 log4j2 日志级别
*
* @author jbp
*/
@Component
public class JbpLoggerControl {
private static String currentLevel = null;
private Logger logger = LogManager.getLogger(JbpLoggerControl.class);
@Value("${jbp.current.applicationName}")
private String applicationName;//当前应用的系统名(对应配置中心配置的key值)
@Autowired
private JbpCommonConcrete jbpCommonConcrete;
@PostConstruct
@Scheduled(cron = "0 * * * * ?")
public void init() {
prepare();
}
private void prepare() {
//配置中心中配置的日志级别(key-value格式的键值对)
String levelInfo = jbpCommonConcrete.getLoggerLevelInfo();
if (StringUtils.isEmpty(levelInfo)) {
logger.info("请确认jbp.common.logger.level内容是否完整" + levelInfo);
return;
}
String levelValue = null;
try {
levelValue = GsonUtil.getKeyValue(applicationName, levelInfo);
} catch (Exception e) {
logger.error("请确认jbp.common.logger.level格式是否为json" + levelInfo, e);
return;
}
if (StringUtils.isEmpty(levelValue)) {
return;
} else if (levelValue.equalsIgnoreCase(currentLevel)) {
return;
}
Configurator.setRootLevel(Level.toLevel(levelValue));
currentLevel = levelValue;
logger.info(applicationName + "日志级别切换至:[" + levelValue + "]");
}
}