logrotate とは?使い方やオプションを解説

logrotatelogrotate とは、ログのサイズや時間に応じて、自動でローテションや削除ができます。
1週間ごとにバックアップ、2世代までバックアップを残す場合
sudo vim /etc/logrotate.d/test
/tmp/rotate/test.log {
    hourly
    maxsize 1M
    create 0660 root root
    rotate 2
}
sudo logrotate -f /etc/logrotate.d/test
関連記事:Linux の基本機能
スポンサーリンク

logrotate の設定

以下の検証用のログを使って、logrotate の動作を検証していきます。

mkdir /tmp/rotate
sudo chmod 755 /tmp/rotate
echo test > /tmp/rotate/test.log

設定ファイルの書き方

logrotate の個別設定ファイルは /etc/logrotate.d 配下です。
※全体設定ファイルは /etc/logrotate.conf

sudo vim /etc/logrotate.d/test
/tmp/rotate/test.log {
    hourly
    maxsize 1M
    create 0660 root root
    rotate 2
}

logrotate の設定ファイルの意味は以下のとおりです。

項目説明
hourlyローテーションの条件1 (hourly/daily/weekly/monthly/yearly を指定可能)
この時間が経過すると、ローテーションする
maxsizeローテーションの条件2
このファイルサイズを超えると、ローテーションする
createローテーションで作成するファイルパーミッション
rotateバックアップを残す世代数

logrotate を実行した時、上記いずれかの条件を満たす場合は、ログをローテーションします。
(条件を満たさない場合は、ローテーションしません。)

logrotate を定期実行

logrotate は次の方法で定期的に実行します。(定期的にローテーションの条件を確認)

systemd タイマーで logrotate (RHEL 9 以降)

RHEL 9 以降では systemd タイマー で logrotate を定期的に実行します。

まずは systemd タイマーの設定を行います。

sudo cp /usr/lib/systemd/system/logrotate.timer /etc/systemd/system/
sudo cp /usr/lib/systemd/system/logrotate.service /etc/systemd/system/
sudo vim /etc/systemd/system/logrotate.timer

OnCalendar と AccuracySec を次のように、1分ごとに誤差 1 秒の精度に設定します。

[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=minutely
AccuracySec=1s
Persistent=true

[Install]
WantedBy=timers.target

ユニットファイル (設定) の詳細な説明や、systemd については以下の記事をご覧ください。

OnCalendar の値を以下のように変更することで、ログのローテーション間隔を指定できます。
(今回は検証のため、minutely を指定してみます。)

Oncalendar の値意味
[曜日 年-月-日 時:分:秒]例:Wed *-*-* 22:00:00 は、全ての年月日の水曜 22 時を表す
書式の詳細はこちら
minutely毎分
hourly毎時間
daily毎日
monthly毎月
yearly毎年

これまでに設定した内容を systemd に反映させます。

sudo systemctl daemon-reload

設定ファイルのタイマーが設定されているか確認します。

sudo systemctl list-timers
NEXT                        LEFT        LAST                        PASSED    UNIT                             ACTIVATES                         
Tue 2024-11-12 05:22:00 UTC 16s left    Tue 2024-11-12 05:21:39 UTC 3s ago     logrotate.timer                 logrotate.service

次のローテーションの時間などが正しく設定できているか確認できます。

cron で logrotate (RHEL 8 以前)

RHEL 8 以前では、cron で logrotate を毎日実行します。

今回は logrotate の実行 (ローテーションの条件確認) 頻度を毎日から毎時に変更します。

/etc/cron.daily/ から /etc/cron.hourly/ に logrotate を移動して、cron の頻度を変更します。

sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/

1 時間後にログがローテーションされていることを確認します。

ls /tmp/rotate/
test.log  test.log-2024111010  test.log-2024111011
スポンサーリンク

logrotate のテスト

systemd タイマーcron の実行を待てない。今すぐテストしたい!と思うかもしません。

ここでは、logrotate テストするための方法を紹介します。

dry-run (dオプション)

sudo logrotate -dv /etc/logrotate.d/test

dry-run を実行し、設定ファイルの確認や実行結果を確認できます。
(dry-run なので、実際にはローテーションしません。)

手動実行 (強制ローテーション)

実際にローテーションしたい場合は、以下のコマンドで強制ローテーションします。

sudo logrotate -f /etc/logrotate.d/test
ls /tmp/rotate/
test.log  test.log.1

現行世代がバックアップ (test.log.1) となり、新規に空のファイル (test.log) が作成されました。

次に、設定した世代を超えると、ログが削除されることを確認します。

sudo logrotate -f /etc/logrotate.d/test
sudo logrotate -f /etc/logrotate.d/test
ls /tmp/rotate/test*
/tmp/rotate/test.log  /tmp/rotate/test.log.1  /tmp/rotate/test.log.2

合計三回ローテーションをしましたが、「rotate 2」の設定により、3世代目は削除されています。
(現行ログ、1世代目、2世代目のログのみ残っています)

スポンサーリンク

関連情報

関連記事:Linux の基本機能