Apollo 本身是可以基于事件监听实时推送(Http长连接)变更(AutoUpdateConfigChangeListener),也会定时拉取(fallback)最新配置。
如果说我们还需要在配置更新时,做一些其他的业务,比如:对配置做了一些自己的数据缓存,或者业务变更等,那么我们需要控制监听器,apollo提供了这样的策略。可手动配置一个监听器在容器中。
监听 Apollo 动态设置日志级别
import ch.qos.logback.classic.Level;import ch.qos.logback.classic.Logger;import ch.qos.logback.classic.LoggerContext;import com.ctrip.framework.apollo.model.ConfigChangeEvent;import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;import lombok.extern.log4j.Log4j;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Configuration;import java.util.Set;/*** @description: 监听 Apollo 配置动态设置日志级别* @author: zcq* @date: 2020/11/15 10:59 上午*/@Log4j@Configurationpublic class DynamicLoggersConfig {/*** 日志级别 Key*/private final static String LOGGER_KEY = "logging.level";@ApolloConfigChangeListener(value = "config")private void configChangeListener(ConfigChangeEvent changeEvent) {Set<String> keyNames = changeEvent.changedKeys();keyNames.stream().filter(LOGGER_KEY::equals).map(key -> changeEvent.getChange(key).getNewValue()).forEach(strLevel -> {LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();Logger logger = loggerContext.getLogger("root");logger.setLevel(Level.toLevel(strLevel));});}}
lockback.xml 里配置的是 debug,Apollo 里配置 logging.level = info这样可以通过修改Apollo配置动态设置生产的日志输出级别,从而来排查问题
<root level="debug"><appender-ref ref="console"/><appender-ref ref="debug"/><appender-ref ref="info"/><appender-ref ref="error"/><appender-ref ref="httpRequestLog"/></root>
