【Spring-boot】Apollo动态配置日志级别

生产环境可以通过阿波罗配置动态修改日志级别

package com.lh.demo.config;

import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.enums.PropertyChangeType;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @author: fenda
 * @createDate: 2022/11/16 10:49
 * @version: 1.0
 * @description:
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
public class LogListenerConfig {

    public static final String LOGGING_LEVEL_PREFIX = "logging.level.";

    private static final String DEFAULT_LEVEL = "info";

    private final LoggingSystem loggingSystem;

    @ApolloConfig
    private Config config;

    @PostConstruct
    private void initLoggingLevel() {
        if (config == null) {
            log.warn("Apollo config NOT not enabled, ignore Apollo Logging Config");
            return;
        }
        for (String configKey : config.getPropertyNames()) {
            if (configKey.startsWith(LOGGING_LEVEL_PREFIX)) {
                LogLevel logLevel = LogLevel.valueOf(config.getProperty(configKey, DEFAULT_LEVEL).toUpperCase());
                loggingSystem.setLogLevel(configKey.replaceFirst(LOGGING_LEVEL_PREFIX, ""), logLevel);
                log.info("Logging level of [{}] has been changed to {}", configKey, logLevel.name());
            }
        }
    }

    @ApolloConfigChangeListener
    public void apolloConfigChange(ConfigChangeEvent changeEvent) {
        for (String changedKey : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(changedKey);
            String newLevel = change.getNewValue();
            if (changedKey.startsWith(LOGGING_LEVEL_PREFIX)) {
                LogLevel logLevel = LogLevel.valueOf(newLevel.toUpperCase());
                loggingSystem.setLogLevel(changedKey.replace(LOGGING_LEVEL_PREFIX, ""), logLevel);
                log.info("Logging level of [{}] has been changed from {} to {}", changedKey, change.getOldValue(), newLevel);
                continue;
            }
            PropertyChangeType changeType = change.getChangeType();
            switch (changeType) {
                case ADDED:
                    log.info("Config [{}] Added: {}", changedKey, change.getNewValue());
                    break;
                case MODIFIED:
                    log.info("Config [{}] Changed from {} to {}", changedKey, change.getOldValue(), newLevel);
                    break;
                case DELETED:
                    log.info("Config [{}] Deleted: {}", changedKey, change.getOldValue());
                    break;
            }
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值