Tomcat 9 (Windows) で複数WARごとに yml / log設定を分離する方法
ここでは、1台のTomcat 9 (Windows) に複数WARを載せる前提で、
各アプリごとに application.yml や log設定(xml) を分離する方法を整理します。
先に結論:
- あなたが調査された
Tomcat 9.0\conf\Catalina\localhost\{app}.xmlは、実運用でも最も一般的な方法です。 - ただしそれ以外にも、Tomcatインスタンス分離(CATALINA_BASE分離) や、TomcatサービスごとのJavaオプション という選択肢があります。
- 1つのTomcatプロセスで複数WARを動かす場合、JVMシステムプロパティ(-D...) は全WARに共通なので、アプリ単位に完全分離しづらい点に注意が必要です。
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上でもアプリ単位で値を分離できることです。
注意:
- 上記
<Environment>の値を実際にどう使うかは、アプリ側(Spring等)の読み込み実装に依存します。 - 「Spring Bootの外部設定をそのまま読む」なら、次章の設計例を参考にしてください。
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:\tomcat-base\app1とC:\tomcat-base\app2を作る - 各サービスで
CATALINA_BASEを切り替えて登録 - ポート(HTTP/AJP/Shutdown)はインスタンスごとに重複しないように調整
こんな時はC方式が有効:
- アプリごとにログローテーション、JVMメモリ、起動パラメータを完全分離したい
- 一部アプリだけ再起動したい
- 本番障害時の切り分けを容易にしたい
5. Spring Boot系WARでの実践パターン
Spring Boot系なら、外部設定配置を以下のようにすると管理しやすいです。
C:\apps-config\
app1\
application.yml
logback-spring.xml
app2\
application.yml
logback-spring.xml
推奨の考え方
- 単一Tomcatで複数WARを運用する場合: A方式(app別Context XML)を軸にする
- JVM共通値で問題ない場合のみ: B方式(-D)を併用する
- 分離要件が強い場合: C方式(Tomcatインスタンス分離)へ
6. どれを選ぶべきか(実務の目安)
| 要件 | 推奨 |
|---|---|
| まずは最小変更でアプリ別に設定したい | A方式(Catalina/localhost配下の app別XML) |
| 全部のWARで同じ設定でもよい | B方式(TomcatサービスのJava Options) |
| 障害分離・運用分離・再起動分離を重視 | C方式(CATALINA_BASE分離) |
まとめ:
あなたの見つけた方法は正攻法です。追加の選択肢としては、
「サービス全体で共通値を渡す(-D)」 と
「Tomcatインスタンス自体を分離する」 の2つが主な実務解になります。
7. 実ファイル雛形(そのまま流用できるサンプル)
このページで説明した雛形を、実ファイルとして同梱しています。