Apollo 本身是可以基于事件监听实时推送(Http长连接)变更(AutoUpdateConfigChangeListener),也会定时拉取(fallback)最新配置。
如果说我们还需要在配置更新时,做一些其他的业务,比如:对配置做了一些自己的数据缓存,或者业务变更等,那么我们需要控制监听器,apollo提供了这样的策略。可手动配置一个监听器在容器中。

监听 Apollo 动态设置日志级别

  1. import ch.qos.logback.classic.Level;
  2. import ch.qos.logback.classic.Logger;
  3. import ch.qos.logback.classic.LoggerContext;
  4. import com.ctrip.framework.apollo.model.ConfigChangeEvent;
  5. import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
  6. import lombok.extern.log4j.Log4j;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.context.annotation.Configuration;
  9. import java.util.Set;
  10. /**
  11. * @description: 监听 Apollo 配置动态设置日志级别
  12. * @author: zcq
  13. * @date: 2020/11/15 10:59 上午
  14. */
  15. @Log4j
  16. @Configuration
  17. public class DynamicLoggersConfig {
  18. /**
  19. * 日志级别 Key
  20. */
  21. private final static String LOGGER_KEY = "logging.level";
  22. @ApolloConfigChangeListener(value = "config")
  23. private void configChangeListener(ConfigChangeEvent changeEvent) {
  24. Set<String> keyNames = changeEvent.changedKeys();
  25. keyNames.stream().filter(LOGGER_KEY::equals).map(key -> changeEvent.getChange(key).getNewValue()).forEach(strLevel -> {
  26. LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
  27. Logger logger = loggerContext.getLogger("root");
  28. logger.setLevel(Level.toLevel(strLevel));
  29. });
  30. }
  31. }

lockback.xml 里配置的是 debug,Apollo 里配置 logging.level = info这样可以通过修改Apollo配置动态设置生产的日志输出级别,从而来排查问题

  1. <root level="debug">
  2. <appender-ref ref="console"/>
  3. <appender-ref ref="debug"/>
  4. <appender-ref ref="info"/>
  5. <appender-ref ref="error"/>
  6. <appender-ref ref="httpRequestLog"/>
  7. </root>