日志级别修改热生效

2023-07-06  本文已影响0人  王大千_xMol_西摩尔

结合一篇文章实现-定时任务刷新: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 + "]");
    }
}
上一篇下一篇

猜你喜欢

热点阅读