1. 程式人生 > >[SpringBoot] 通過EnvironmentPostProcessor介面隱式修改配置 -- 修改日誌級別

[SpringBoot] 通過EnvironmentPostProcessor介面隱式修改配置 -- 修改日誌級別

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);
        }
    }
}
    程式碼很清晰簡單,先判斷是否有spring.cloud.zookeeper.connect-string這項配置,如果有,那麼什麼都不做,如果沒有,那麼就關閉warn的日誌級別;

    4.小結

    這裡是個小案例,其實通過這樣的思想,我們可以預處理很多情況,通過一些配置的情況,來新增甚至修改一些配置,比如可以將一些系統的預設配置給修改了,true改為false那樣的。