[SpringBoot] 通過EnvironmentPostProcessor介面隱式修改配置 -- 修改日誌級別
阿新 • • 發佈:2018-12-28
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); } } }