概要
Logback でログローテートを行っている場合、新しいファイルが出力されるまでは、システム日時が切り替わったとしても、古いファイルがロックされ続ける。
例えば、日次ローテートの場合を考える。システム日付が8月5日のときに、8月4日までのファイルを別ディレクトリに移動しようとしたとする。8月5日はまだアクセスがなく、ログファイルが出力されていない。このとき、8月4日のファイルがまだロックされており、移動や削除が行えない。
AccessLog-2024-08-03.log
AccessLog-2024-08-04.log <- 8月5日になっても、次のファイルができない限りロックされたまま
古いログを別の場所に移動するようなバッチを作る際に気をつけた方がよいポイントである。
検証
以下の環境でテスト用の Web アプリを作って検証。
- Windows 11 23H2
- Java 17
- Spring Boot 3.3.1
今回は検証のため1分おきにローテートしてみる。logback.xml を以下のように設定。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/AccessLog-%d{yyyy-MM-dd-HHmm}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss'Z'} - %m%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
PowerToys の File Locksmith でロック状況を見てみる。18:06 より後のログを出力していない状態では、システム時刻が 18:08 になってもファイルがロックされたままであることがわかる。
新しいログファイルが作成されると、18:06 のファイルはロックが解除される。