SpringBoot+logbackでログローテーションがされない問題でハマる

 

先に結論を言うと、アプリの設定はできていたのだが、サーバのログ出力先のディレクトリの書き込み権限がなかったというのが問題だった。

 

環境

・Java8

・SpringBoot2.2.4

・Tomcat9

・サーバはLinuxだがバージョンは忘れた

 

状況

・インフラ的な制約があり、warファイルでのデプロイを行っていた。

・logcack-Spring.xmlは下記の様に、日次でログローテーションがされるように設定。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>/logs/app-%d{yyyyMMdd}.log.</fileNamePattern>
        <maxHistory>4</maxHistory>
    </rollingPolicy>

    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>

</configuration>

・同じファイル(app.log)に書き込みが行われ続け、日をまたいでもローテーションが行われなかった。

・Tomcatの実行ユーザはtomcatで、ログ出力先のディレクトリはrootが作った特定のディレクトリ。権限はdrwxr--r--

 

ローテーションがされない原因

ログ出力対象ディレクトリに書き込み権限がなかったため。そりゃ、ログローテされないわけだ。

そういえば、デプロイ時、ログファイルを事前に作成して、権限を777に設定しないとTomcatが起動しない。このタイミングで気付くべきだった…

 

対応

ログ出力対象の権限を775に設定。

ログローテされるようになる。

 

反省

ローカルの開発環境がWindowsで特に問題なくログローテできていた。やはり、開発する環境と本番環境は可能な限り揃えるのが良さそう。

SpringBoot入りのCentOSで、VSCodeでローカルの修正をVMに反映してくれてそのまま実行できる状態にする環境って可能なんだろうか…