springboot集成apollo動態刷新日志級別


還是老規矩,直接上代碼

@Configuration
public class LogListenerConfig {
    private static final Logger log = LoggerFactory.getLogger(LoggerConfiguration.class);
    private static final String PREFIX = "logging.all.";
    private static final String ROOT = LoggingSystem.ROOT_LOGGER_NAME;

    @Resource
    private LoggingSystem loggingSystem;

    @ApolloConfigChangeListener("LogNameSpace")//這里填日志配置的命名空間
    private void onChange(ConfigChangeEvent changeEvent) {
        refreshLoggingLevels(changeEvent);
    }

    private void refreshLoggingLevels(ConfigChangeEvent changeEvent) {
        for (String key : changeEvent.changedKeys()) {
            // key may be : logging.all.level
            if (StringUtils.startsWithIgnoreCase(key, PREFIX)) {
                log.error("changed value {} ", changeEvent.getChange(key));
                String loggerName = ROOT;
                String strLevel = changeEvent.getChange(key).getNewValue();
                LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
                loggingSystem.setLogLevel(loggerName, level);

                log(loggerName, strLevel);
            }
        }
    }

    /** * 獲取當前類的Logger對象有效日志級別對應的方法,進行日志輸出。舉例: * 如果當前類的EffectiveLevel為WARN,則獲取的Method為 `org.slf4j.Logger#warn(java.lang.String, java.lang.Object, java.lang.Object)` * 目的是為了輸出`changed {} log level to:{}`這一行日志 */
    private void log(String loggerName, String strLevel) {
        try {
            LoggerConfiguration loggerConfiguration = loggingSystem.getLoggerConfiguration(log.getName());
            Method method = log.getClass().getMethod(loggerConfiguration.getEffectiveLevel().name().toLowerCase(), String.class, Object.class, Object.class);
            method.invoke(log, "changed {} log level to:{}", loggerName, strLevel);
        } catch (Exception e) {
            log.error("changed {} log level to:{} error", loggerName, strLevel, e);
        }
    }
}

完啦,so easy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM