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
@Configuration
public 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>