EnvironmentPostProcessor接口
继承该接口,可以在项目启动初期对配置做一些修改,根据最近的一个使用场景做了一个小结;
1.场景简述如下,在之前的一篇博客中有简单介绍,通过spring.factories来切换注册中心,遇到了一个问题,当使用Eureka作为注册中心的时候,配置中没有填写zookeeper的地址,此时可以正常注册到Eureka,但是zookeeper会循环不断的打印warn日志,我们可以在log4j2.xml文件中设置
<Logger name="org.apache.zookeeper" level="error"/>
来屏蔽这个包下的warn日志,但是这样不灵活,因为开发人员每次去修改不方便,而且提供的是基础jar包,是否可以在提供的jar里面完成这个工作呢?
2.配置:
除了在上面说的在配置文件限制指定包的日志级别之外,可不可以做成key-value的配置形式呢?查询资料,可以在bootstrap.properties文件中配置logging.level.com.nero=DEBUG,来限制一个包的日志级别,那么既然是可以通过配置的形式们就可以考虑用实现EnvironmentPostProcessor接口的方法;
3.代码:
在resources/META-INF/spring.factories里面添加:
org.springframework.boot.env.EnvironmentPostProcessor=com.xxxx.MyEnvironmentPostProcessorZkLog
添加类文件:
@Component
public class MyEnvironmentPostProcessorZkLog implements EnvironmentPostProcessor {
private static final String ZK_SERVER_KEY = "spring.cloud.zookeeper.connect-string";
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
String zkConnectString = environment.getProperty(ZK_SERVER_KEY);
//没有配置时,说明没有使用zk作为注册中心,那么就关闭warn及以下级别的日志,配置了,则不干预
if (zkConnectString == null ) {
HashMap<String, Object> map = new HashMap<>(1);
map.put("logging.level.org.apache.zookeeper", "error");
PropertySource source = new MapPropertySource("logLevelZk", map);
environment.getPropertySources().addFirst(source);
}
}
}