web-dev-qa-db-ja.com

Beanのインスタンス化の前に、Spring Bootアプリケーションのすべてのアクティブなプロパティをログに記録する方法は?

すでに question がアクティブな構成のログを要求していますが、正しい answer がありますが、問題は、すべてのBeanが正しくインスタンス化された場合にのみ構成がログに記録されることです。起動時にアプリケーションがクラッシュした場合でも、(主に)すべてのプロパティをログに記録したいと思います。私の質問はより具体的です:

スプリングブートアプリケーションのすべてのアクティブなプロパティをログに記録する方法beforeBeanのインスタンス化?

10
Ortomala Lokni

これを行うには、 ApplicationListener を登録する必要があります。ドキュメントによると、キャッチするイベントは ApplicationPreparedEvent です。

ApplicationPreparedEventは、SpringApplicationが起動し、ApplicationContextが完全に準備されているが更新されていないときに発行されるイベントです。 Bean定義がロードされ、この段階で環境を使用できるようになります。

メインメソッドは次のようになります。

public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(MyApplication.class);
        springApplication.addListeners(new PropertiesLogger());
        springApplication.run(args);        
}

現在の質問で引用されている回答のコードを再利用しましたが、取得したコンテキストがまだ更新されておらず、環境の構造がアプリケーションの起動後とまったく同じではないため、変更しました。プロパティソース別のプロパティも出力しました。1つはシステム環境用、1つはシステムプロパティ用、1つはアプリケーション構成プロパティ用などです。ApplicationPreparedEventは複数回トリガーできることにも注意してください。 、そしてプロパティを初めて印刷することです。詳細は Spring Boot issue#8899 を参照してください。

package com.toto.myapp.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.PropertySource;

import Java.util.LinkedList;
import Java.util.List;

public class PropertiesLogger implements ApplicationListener<ApplicationPreparedEvent> {
  private static final Logger log = LoggerFactory.getLogger(PropertiesLogger.class);

  private ConfigurableEnvironment environment;
  private boolean isFirstRun = true;

  @Override
  public void onApplicationEvent(ApplicationPreparedEvent event) {
    if (isFirstRun) {
      environment = event.getApplicationContext().getEnvironment();
      printProperties();
    }
    isFirstRun = false;
  }

  public void printProperties() {
    for (EnumerablePropertySource propertySource : findPropertiesPropertySources()) {
      log.info("******* " + propertySource.getName() + " *******");
      String[] propertyNames = propertySource.getPropertyNames();
      Arrays.sort(propertyNames);
      for (String propertyName : propertyNames) {
        String resolvedProperty = environment.getProperty(propertyName);
        String sourceProperty = propertySource.getProperty(propertyName).toString();
        if(resolvedProperty.equals(sourceProperty)) {
          log.info("{}={}", propertyName, resolvedProperty);
        }else {
          log.info("{}={} OVERRIDDEN to {}", propertyName, sourceProperty, resolvedProperty);
        }
      }
    }
  }

  private List<EnumerablePropertySource> findPropertiesPropertySources() {
    List<EnumerablePropertySource> propertiesPropertySources = new LinkedList<>();
    for (PropertySource<?> propertySource : environment.getPropertySources()) {
      if (propertySource instanceof EnumerablePropertySource) {
        propertiesPropertySources.add((EnumerablePropertySource) propertySource);
      }
    }
    return propertiesPropertySources;
  }
}
17
Ortomala Lokni