Spring Boot でログを日単位でローテートする

2017.02.27

はじめに

アプリケーションを業務で開発しているとログファイルの運用というのも大切になってきます。ローテートを行うことで、ログファイルのサイズが増え続けることを避けることも多いと思います。今回はSpring Bootにて、ログファイルを日単位でローテートする方法について調べてみました。

ローテートの設定

Spring Bootではデフォルト設定だと、ログファイルのサイズが10MBに達するとローテートされるようです(26. Logging)。以下、これを日単位に変更するための設定についてです。

1.Javaプログラム

先ず最初にログを出力するだけのJavaプログラムについてです。これについてはSpring Bootを起動してログを出力しているのみなので、詳細な説明は省きたいと思います。

package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner{
    private final static Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        logger.info("start");
        logger.info("end");
    }
}

2.logback.xml

ログについての基本的な設定はappliation.ymlに記述可能ですが、ローテートなどの詳細な設定はlogback.xmlに記述します(logbackを使用する場合)。今回は以下のように設定しました。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <timestamp key="LOG_DATE" datePattern="yyyyMMdd"/>
    <property name="LOG_FILE" value="logs/application.log" />

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>${LOG_FILE}.%d{yyyyMMdd}</fileNamePattern>
        <maxHistory>2</maxHistory>
    </rollingPolicy>

    </appender>

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

</configuration>

5・6行目でローテートする際の日付のパターン、ログファイルのパスを定義しています。またローテートする際のログファイル名のパターンを14行目で、保持する最大日数を15行目で定義しています。

動作確認

では実行するマシンの日付を変えつつアプリを起動し、ログがローテートされるかを確認してみます。2/21からスタートし、一日ずつ日付をずらしていきたいと思います。

2/21で実行

$ date
2017年 2月21日 火曜日 17時31分26秒 JST

実行すると

$ ls -l logs/
(中略) 2 21 17:33 application.log

2/22で実行

$ date
2017年 2月22日 水曜日 17時36分15秒 JST

実行すると

$ ls -l logs/
total 16
(中略) 2 22 17:36 application.log
(中略) 2 21 17:33 application.log.20170221

前日分が別ファイルになっています。

2/23で実行

$ date
2017年 2月23日 木曜日 17時37分24秒 JST

実行すると

$ ls -l logs/
total 24
(中略) 2 23 17:37 application.log
(中略) 2 21 17:33 application.log.20170221
(中略) 2 22 17:36 application.log.20170222

2/24で実行

$ date
2017年 2月24日 金曜日 17時38分44秒 JST

実行すると

$ ls -l logs/
total 24
(中略) 2 24 17:39 application.log
(中略) 2 22 17:36 application.log.20170222
(中略) 2 23 17:37 application.log.20170223

定義した保持する最大日数(今回は2日)以前のファイルが消えてますね。

まとめ

このような感じでコーティングすることなくログファイルのローテートが実現できました。今回は試していませんが、時間単位などの指定もできるようです。要件によって色々試してみて下さい。