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

logrotatelogrotate とは、ログのサイズや時間に応じて、自動でローテションや削除ができます。
1週間ごとにバックアップ、2世代までバックアップを残す場合
sudo vim /etc/logrotate.d/test
/var/log/test.log {
    hourly
    maxsize 1M
    create 0644 root root
    rotate 2
}
sudo vim /etc/systemd/system/logrotate.timer
[Timer]
OnCalendar=hourly
AccuracySec=1m
Persistent=true

[Install]
WantedBy=timers.target
sudo logrotate -f /etc/logrotate.d/test
関連記事:Linux の基本機能
学習ロードマップ
スポンサーリンク

logrotate の設定

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

sudo sh -c "echo test > /var/log/test.log"

設定ファイルの書き方

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

sudo vim /etc/logrotate.d/test
/var/log/test.log {
    hourly
    maxsize 1
    create 0644 root root
    rotate 2
}

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

項目説明
hourlyローテーションの条件1 (hourly/daily/weekly/monthly/yearly を指定可能)
この時間が経過すると、ローテーションする
maxsizeローテーションの条件2 (k=キロバイト/M=メガバイト/G=ギガバイト)
このファイルサイズを超えると、ローテーションする
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

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

[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 の値を以下のように変更することで、ログのローテーション間隔を指定できます。

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

ローテーションの時刻になると、ログがローテーションされているか確認します。

ls /var/log/test*
/var/log/test.log  /var/log/test.log-2024111815

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 /var/log/test*
test.log  test.log-2024111010  test.log-2024111011
スポンサーリンク

logrotate のテスト

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

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

手動実行

systemd タイマーcron の実行が待てない場合、次の方法で直接ローテーションを実行します。

sudo logrotate /etc/logrotate.d/test

設定ファイルの条件※を満たした場合、ローテーションします。

ls /var/log/test*
/var/log/test.log  /var/log/test.log.1

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

うまくローテーションされない場合

本記事で設定した条件はファイルを作成してから 1 時間経過 or サイズが 1Byte 以上です。

そのため、1Byte 以上のファイルを作成し直します。

sudo sh -c "echo test > /var/log/test.log"
sudo logrotate /etc/logrotate.d/test
ls /var/log/test*
/var/log/test.log  /var/log/test.log.1

強制ローテーション (fオプション)

条件に関わらず、強制ローテーションしたい場合は、-f オプションを利用します。

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

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

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

「rotate 2」の設定により、2世代目のログまでしか残りません。

dry-run (dオプション)

ローテーションせずに、設定ファイルの動作を確認したい場合は dry-run を実行します。

sudo logrotate -dv /etc/logrotate.d/test
スポンサーリンク

関連情報

学習ロードマップ
関連記事:Linux の基本機能
Linux カーネルの機能
ネットワークのコマンド
関連記事:サーバー