美文网首页
日志级别修改热生效

日志级别修改热生效

作者: 王大千_xMol_西摩尔 | 来源:发表于2023-07-06 11:41 被阅读0次

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

    相关文章

      网友评论

          本文标题:日志级别修改热生效

          本文链接:https://www.haomeiwen.com/subject/tyqdvktx.html