Tomcat連携
このページでは、Tomcat固有の設定と動作を説明します。
動作の仕組み
組み込みサーバーがTomcatの場合、スターターはAccessLogを実装したEngineレベルのValveを登録します。リクエスト完了後にTomcatがこのValveを呼び出すと、スターターは設定済みのAppenderを通じてアクセスイベントを出力します。
Tomcat固有のプロパティ
logback:
access:
tomcat:
# 未設定時、RemoteIpValveの存在から自動判定
request-attributes-enabled: true| プロパティ | デフォルト | 説明 |
|---|---|---|
logback.access.tomcat.request-attributes-enabled | 自動検出 | RemoteIpValveが設定するアクセスログ属性を反映する。未設定時、パイプラインにRemoteIpValveが存在すれば自動的に有効化する。 |
リクエスト属性
request-attributes-enabledがtrueのとき、スターターは生の接続値ではなく以下のTomcatアクセスログ属性(通常はRemoteIpValveが設定)を参照します。これによりリバースプロキシ越しのクライアント情報がアクセスログに反映されます。
| 属性 | 影響する変数 | 説明 |
|---|---|---|
org.apache.catalina.AccessLog.RemoteAddr | %h, %a | 転送されたクライアントIPアドレス。 |
org.apache.catalina.AccessLog.RemoteHost | %h(存在時) | 転送されたクライアントホスト名。 |
org.apache.catalina.AccessLog.Protocol | %H, %r | 転送されたプロトコル(例: https)。 |
org.apache.catalina.AccessLog.ServerName | サーバー名 | Hostヘッダーから転送されたサーバー名。 |
org.apache.catalina.AccessLog.ServerPort | %p(server戦略時) | 転送されたサーバーポート。 |
request-attributes-enabledを未設定にすると、TomcatのパイプラインからRemoteIpValveを検出した場合に自動的に有効化されます。
パターン変数
全パターン変数のリファレンスははじめに — パターン変数を参照してください。
任意のリクエスト属性は汎用変換ワード%{name}rで読み出せます(例: %{org.apache.catalina.AccessLog.RemoteAddr}r)。上表の5つの属性は加えて、標準変数を導出するためにスターター内部でも参照されます。
経過時間
%Dと%Tはリクエスト処理時間を出力します。TomcatのAccessLog.log(request, response, time)コントラクトはナノ秒単位で値を提供するため、スターターはこれをミリ秒に変換して保存します。Tomcatから値が提供されない場合、System.currentTimeMillis() - request.coyoteRequest.startTimeから算出します。
リバースプロキシの背後での使用
アプリケーションがプロキシ(nginx、Apache、ロードバランサー)の背後にある場合、Spring BootのRemoteIpValveを有効化し、%hなどの変数が元のクライアントを反映するようにします。
server:
tomcat:
remoteip:
remote-ip-header: X-Forwarded-For
protocol-header: X-Forwarded-ProtoスターターはValveを自動検出し、そのアクセスログ属性を反映するようになります。これによりアクセスログにはプロキシではなく転送されたクライアントアドレスが記録されます。
ローカルポート戦略
%p変数が報告するポートを選択します。
logback:
access:
local-port-strategy: server # または 'local'server: クライアントが指定したポート。RemoteIpValveとrequest-attributes-enabledを併用した場合、X-Forwarded-Portを反映する。local: 接続を受け付けたローカルインターフェースのポート。
Spring Security連携
Spring Securityがクラスパスにある場合(Servlet限定)、スターターは認証済みユーザー名を%uに書き込みます。
<pattern>%h %l %u [%t] "%r" %s %b</pattern>%u変数の出力:
- 認証済みユーザー名、または
- 匿名リクエストでは
-。
詳細は高度な設定 — Spring Security連携を参照してください。リアクティブアプリケーション(Tomcat上のSpring WebFlux)では、%uは常に-を表示します。
設定例
アプリケーション名をプレフィックスとしてローテーションファイルに出力し、運用エンドポイントを除外する本番向け設定例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="appName" source="spring.application.name"
defaultValue="app" scope="context"/>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/access.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%h %l %u [%t] "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D</pattern>
</encoder>
</appender>
<appender-ref ref="file"/>
</configuration>アプリケーションプロパティ:
logback:
access:
tomcat:
request-attributes-enabled: true
filter:
exclude-url-patterns:
- /actuator/.*
- /health
- /favicon.ico