2016-07-13 36 views
4

私はSpringブート(WARとしてデプロイされた)に従来のSpring MVCアプリケーションを更新しています。プロジェクトのソースでSpringブート - WARとしてデプロイするときにWEB-INF /フォルダから 'logback.xml'をロード

webapp/WEB-INF/logback.xml

、もし:

一つの要件は、私たちのリモートインストールとの互換性を保持するために、を必要logback.xmlファイルが展開され、Webアプリケーションで次の場所にあるようにということです私はsrc/main/webapp/WEB-INF/logback.xmlにファイルを入れて、それはwebapp/WEB-INF/logback.xmlに正常にコピーされますが、私はそれをロードして、その場所から使用する方法を見つけることができます。

私は、次の春ブーツlogging.configプロパティを設定しようとしました:

logging.config=/WEB-INF/logback.xml 

は自動設定はそれの世話をするだろうと期待しているが、これは、エラー・メッセージおよびデフォルト春ブートログなしで失敗します代わりに設定が読み込まれます。

Spring Bootでこれを処理する適切な方法は何ですか? (サンプルコードは歓迎されている)

+1

私はこの問題はSpring Bootとは関係ないと思いますが、 '/ WEB-INF'はクラスパス上になく、'/WEB-INF/classes'だけではありません。 Logbackはクラスパス上でxmlを見つけようとします。ファイルを 'classes'に移動できない場合は、/ WEB-INFをクラスパスに追加する方法を理解する必要があります。それを行うための簡単なアプリケーションサーバーの独立した方法があるかどうかは分かりません。 Googleの 'war custom classpath'と表示されます。 – Arthur

+0

私はこの問題はSpring Bootとは関係がないと思いますが、 '/ WEB-INF'はクラスパス上になく、'/WEB-INF/classes'だけではありません。 Logbackはクラスパス上でxmlを見つけようとします。ファイルを 'classes'に移動できない場合は、/ WEB-INFをクラスパスに追加する方法を理解する必要があります。それを行うための簡単なアプリケーションサーバーの独立した方法があるかどうかは分かりません。 Googleの 'war custom classpath'と表示されます。 – Arthur

答えて

1

これはハックを必要とすることが判明:

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    // In case of regular deployments, use WEB-INF/logback.xml 
    @Override 
    public void onStartup(final ServletContext servletContext) throws ServletException { 
     super.onStartup(servletContext); 
     configureLogging(servletContext); 
     LoggerFactory.getLogger(getClass()).info("Done configuring"); 
    } 

    // manually configure logging 
    private void configureLogging(final ServletContext servletContext) { 
     try { 
      String realPath = servletContext.getRealPath("/WEB-INF/logback.xml"); 
      LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
      JoranConfigurator configurator = new JoranConfigurator(); 
      configurator.setContext(context); 
      context.reset(); 
      configurator.doConfigure(realPath); 
     } catch (JoranException je) { 
      // StatusPrinter will handle this 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 

} 

はまた、私はsrc/main/resourceslogback-spring.xmlを持っていた:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <include resource="logback-include.xml" /> 
</configuration> 

logback -include.xmlsrc/main/resourcesは、いくつかの共通の構成を持っていました。

<?xml version="1.0" encoding="UTF-8"?> 
<included> 
    <include resource="org/springframework/boot/logging/logback/defaults.xml" /> 
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> 

    <!-- put your loggers here --> 
    <logger name="org.springframework.web" additivity="false" level="INFO"> 
     <appender-ref ref="CONSOLE"/> 
    </logger> 

    <!-- put your root here --> 
    <root level="INFO"> 
     <appender-ref ref="CONSOLE"/> 
    </root> 
</included> 

そして、ちょうどlogback-spring.xmlのような一般的な設定をインポートsrc/main/webapp/WEB-INFでようやく、logback.xml:ディレクトリであるwebapp/WEB-INF/にコピーされたファイルにsrc/main/webapp/WEB-INF/結果にlogback.xmlを置く

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <include resource="logback-include.xml" /> 
</configuration> 
+0

この結果、次のWARNメッセージが表示されます。 '| -WARN in ch.qos.logback.core.joran.action.IncludeAction- [/WEB-INF/logback.xml]に対応するリソースが見つかりませんでした。 ' – vtosh

+0

2番目私が引用したドキュメントを理解する方法は、 '@ PropertySources'アノテーションを使用するだけでは動作しません - 「従来の」外部構成(私が試しているように、application.propertiesを介してプロパティを設定する)は、見積もり私は誤解かもしれない。 :) – vtosh

+0

うーん、私はあなたが正しいと思う、私はそれを試した。そして私はあなたの質問に対するArthurのコメントも正しいと思います。私の答えでは、私はartifactを配備しようとしませんでした。私はmvn spring-bootを通して実行しました。ただし、展開しても機能しませんでした。 –

1

クラスパス上にあるwebapp/WEB-INF/classes/より上のレベル。あなたのapplication.propertiesでこれを入れてみてください:logback.xmlが正しく初期化中に配置されます

logging.config=classpath:../logback.xml 

この方法です。 にあるクラスパスの場所を表すために使用されるclasspath:の使用例については、Common Application Propertiesを参照してください。

が、正直に言うと、私はむしろsrc/main/webapp/WEB-INF/logback.xml、(webapp/WEB-INF/logback.xmlが、その後webapp/WEB-INF/classes/logback.xmlにリンクされますから、)の展開のために理にかなっている(そして、あなたのリモートインストールで有用であろう)classes/logback.xmlへのシンボリックリンクを作成しますsrc/main/resourceswebapp/WEB-INF/classes/にコピーされる)にlogback.xmlを入れて、私のスプリングブートアプリケーションをより一般的なものにしておきます。リモートインストールの詳細と互換性の意味はわからないので、これはうまく動作しないかもしれません。

+0

'logging.config = classpath:../logback.xml'を静かに設定すると失敗します。 symlinkの提案は面白いですが、私たちの場合はおそらく適用されません。 – vtosh

+0

@vtosh「サイレント」とはどういう意味ですか? 'logging.config =/WEB-INF/logback.xml'のように、デフォルトのロギング設定がロードされていますか? – xnakos

関連する問題