2013-12-10 3 views
12

をプログラムで設定するにはどうすればよいですか?春の起動アプリケーションではスプリングブートプログラムによるロギング設定

xmlファイルまたはプロパティファイルを使用すると、私のニーズに十分柔軟ではありません。

アップデート:私はこのような何かを達成したい

@Value("${logging.level.root}") 
private String loggingLevelRoot; 

@Value("${logging.level.myApp}") 
private String loggingLevelMyApp; 

@Value("${logging.file}") 
private boolean fileAppenderEnabled; 

.... 

setLevel(Logger.ROOT_LOGGER_NAME, Level.toLevel(loggingLevelRoot))); 
setLevel("com.myapp", Level.toLevel(loggingLevelMyApp))); 
setLevel("org.springframework", Level.WARN); 
setLevel("org.apache.coyote", Level.INFO); 
setLevel("org.apache.catalina", Level.INFO); 
setLevel("org.apache.catalina.startup.DigesterFactory", Level.ERROR); 
setLevel("org.apache.catalina.util.LifecycleMBeanBase", Level.ERROR); 

Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
logger.addAppender(createConsoleAppender()); 
if (fileAppenderEnabled) { 
    logger.addAppender(createFileAppender()); 
} 

は、私は環境ごとに持っているすべてがある:

  • logging.level.root = [INFO、DEBUG、..]
  • logging.level.myApp = [INFO、DEBUG、..]
  • logging.file = [true | false]

私は本当に対処したくないXML、Groovyおよび他のフォーマットの重複はありません。

これは本当に、Spring JavaConfigがBeanに対して行ったのと同じ柔軟性をログに記録することです。 XMLやその他のファイル形式は静的すぎて重すぎる重複を必要とし、アプリケーションの残りの構成と十分に統合されません。

他のどのBeanやサービスとも異なるロギングを設定する必要があるのはなぜですか?それは意味をなさない。

+0

xmlを使用すると十分な柔軟性が得られません。 Logbackを使用する場合、Groovyを使用してログバックを設定できます。 –

+1

@ M.Deinumいいえ、あなたはできません。 Spring Boot(実際には、Spring AutoconfigはGroovyの設定で暴走します)。 – chrylis

+0

私はまた、環境ごとに異なるアペンダーの種類を持つ別の設定が必要です...いいえ、XMLはそれをカットしません。 –

答えて

13

ロギングシステムのデフォルトのXML設定を無効にするかどうかはわかりませんが、以降のカスタマイズ呼び出しを実行したいとします。幸いにも、イニシャライザチェーンで可能な限り早く完了したので、かなり簡単です。SpringApplicationです。あなたのコードを置く最も簡単な場所は、おそらくSpringApplicationInitializerです(ApplicationContextInitializerも実装する必要がありますので、SpringApplicationに追加することができます)。例えば。

SpringApplication application = new SpringApplication(MySources.class); 
application.addInitializers(new LoggingInitializer()); 
application.run(args); 

あなたは、あなたがそのようにそれを行う場合は初期化に依存性の注入を行うことはできませんが、それはそれは可能な限り早期のライフサイクルで呼び出されることを保証します。あなたのイニシャライザがEnvironmentAwareを実装している場合、SpringApplicationInitializer.initialize()への呼び出しの前にEnvironmentのインスタンスも渡されます。これは、サンプルの環境依存部分を解決できることを使用しています。

String loggingLevelRoot = environment.getProperty("logging.level.root"); 

あなたはそれがあなたの初期化クラスを含むMETA-INF/spring.factoriesを追加することで、それは、宣言することができますすべてのアプリケーションで同じことを行うことを避けるために、作業をした後:あなたは本当に依存関係が必要な場合は

org.springframework.context.ApplicationContextInitializer=\ 
my.pkg.for.LoggingInitializer 

注射と@Value決議私はあなたが何かを構成する機会を得る前にApplicationContextが完全にリフレッシュされることを受け入れなければならないと思うと思います。それが受け入れ可能な妥協案件の場合は、文脈にLoggingInitializerを追加し、CommandLineRunnerを実装することをお勧めします。

+0

カスタム 'LoggingSystem'実装でも同様にジョブを実行できますか?これは自動検出されませんので、 '-Dorg.springframework.boot.logging.LoggingSystem = '(またはシステムプロパティを設定する)を追加してください。 –

+0

@DaveSyer 'EnvironmentAware'はこの場合動作しません。 Environmentインスタンスが必要な場合は、 'initialize()'メソッドの中でアプリケーションコンテキストインスタンスから取得する方が良いでしょう。 – ydrozhdzhal

+0

私はこの代替戦略の説明が非常に有用であることを発見しました。私はここで推奨されていることのいくつかを実行する方法の例について、この質問を参照する必要がありました:https://stackoverflow.com/questions/46636599/how-do-i-set-the-logging-properties-in- a-spring-java-configuration?noredirect = 1&lq = 1 – user1445967