Tomcat 9 (Windows) で複数WARごとに yml / log設定を分離する方法

ここでは、1台のTomcat 9 (Windows) に複数WARを載せる前提で、 各アプリごとに application.ymllog設定(xml) を分離する方法を整理します。

先に結論:

1. 代表的な方式の比較

方式 概要 アプリ単位分離 運用難易度
A. Catalina/localhost 配下のContext XML conf\Catalina\localhost\app1.xml などを作り、アプリ別の設定値を持たせる 高い 低〜中
B. Tomcatサービス(Java Options) tomcat9w.exe の Java Options に -D を設定 低い(基本は全アプリ共通) 低い
C. CATALINA_BASEを分けてTomcatを複数起動 アプリ群ごとにTomcatインスタンスを分割し、各インスタンスで設定を独立 非常に高い 中〜高

2. A方式: Catalina/localhost に app別XMLを置く(王道)

あなたが見つけた方法です。Tomcat標準のやり方で、1プロセスに複数WARを置く時に最も使われます。

2-1. 例: app1 用 Context XML

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:/tomcat9/webapps/app1.war">
  <!-- 例: 外部設定ディレクトリ -->
  <Environment name="app.config.dir"
               value="C:/apps-config/app1/"
               type="java.lang.String"
               override="false" />

  <!-- 例: ログ設定XMLのパス -->
  <Environment name="app.logging.config"
               value="C:/apps-config/app1/logback-spring.xml"
               type="java.lang.String"
               override="false" />
</Context>

2-2. 例: app2 用 Context XML

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:/tomcat9/webapps/app2.war">
  <Environment name="app.config.dir"
               value="C:/apps-config/app2/"
               type="java.lang.String"
               override="false" />
  <Environment name="app.logging.config"
               value="C:/apps-config/app2/logback-spring.xml"
               type="java.lang.String"
               override="false" />
</Context>

この方式のポイントは、app1.xml / app2.xml のようにファイルを分けることで、 同じTomcat上でもアプリ単位で値を分離できることです。

注意:

3. B方式: Tomcatサービス側に -D を入れる

Windowsサービスとして動かしている場合、tomcat9w.exe の Java タブで -Dspring.config.additional-location=...-Dlogging.config=... を設定できます。

-Dspring.config.additional-location=file:/C:/apps-config/common/
-Dlogging.config=file:/C:/apps-config/common/logback-spring.xml

これは簡単ですが、同一Tomcatプロセス内の全WARに影響しやすく、 アプリごとの完全分離には不向きです。

4. C方式: CATALINA_BASEを分けてTomcatインスタンスを複数化

アプリごと(またはアプリ群ごと)にTomcatを分離して起動する方式です。 各インスタンスで conf, logs, temp, webapps を分けられるため、 設定の混線を根本的に防げます。

こんな時はC方式が有効:

5. Spring Boot系WARでの実践パターン

Spring Boot系なら、外部設定配置を以下のようにすると管理しやすいです。

C:\apps-config\
  app1\
    application.yml
    logback-spring.xml
  app2\
    application.yml
    logback-spring.xml

推奨の考え方

6. どれを選ぶべきか(実務の目安)

要件 推奨
まずは最小変更でアプリ別に設定したい A方式(Catalina/localhost配下の app別XML)
全部のWARで同じ設定でもよい B方式(TomcatサービスのJava Options)
障害分離・運用分離・再起動分離を重視 C方式(CATALINA_BASE分離)
まとめ: あなたの見つけた方法は正攻法です。追加の選択肢としては、 「サービス全体で共通値を渡す(-D)」「Tomcatインスタンス自体を分離する」 の2つが主な実務解になります。

7. 実ファイル雛形(そのまま流用できるサンプル)

このページで説明した雛形を、実ファイルとして同梱しています。