ログローテーション設定(logrotate)が動かない/古いログが消えないときの修正

  • URLをコピーしました!
目次

概要

Linux サーバーではログファイルの肥大化を防ぐために、logrotate による定期的なローテーションが行われます。
しかし設定ミスや権限、cron の不具合などにより、古いログが削除されない/圧縮されない/ローテーションが実行されない ことがあります。
この記事では、問題の原因と具体的な修復手順を整理します。

主な原因と現象

原因現象・症状
logrotate の設定ファイルに構文エラーlogrotate 実行時にエラーが出て処理が途中で止まる
cron / systemd timer が動作していない自動ローテーションが実行されない
ログファイルのパーミッションが不正ローテーション時に permission denied が発生
ログファイルパスの指定ミス実際のログファイルが対象外で古いログが残る
missingoknotifempty の設定不足ログが存在しない・空のときにエラー終了する
postrotate スクリプトの失敗ローテーション後のサービス再起動に失敗して停止する

1. 動作確認と手動実行テスト

まず logrotate が正常に動くかを確認します。

sudo logrotate -d /etc/logrotate.conf

-d はデバッグモードで実際にはファイルを削除しません。
問題がなければ以下で手動実行します。

sudo logrotate -f /etc/logrotate.conf

2. 設定ファイルの構文チェック

設定ファイル(例:/etc/logrotate.d/nginx)の構文を確認します。

sudo logrotate -d /etc/logrotate.d/nginx

エラー例:

error: bad rotation count 'weekly'
error: nginx: unknown option 'compressdaily'

修正例(正しい書式):

/var/log/nginx/*.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
    postrotate
        systemctl reload nginx > /dev/null 2>&1 || true
    endscript
}

3. 自動実行の仕組みを確認(cron / systemd)

✅ cron 方式の場合(古い OS)

cat /etc/cron.daily/logrotate

内容に logrotate /etc/logrotate.conf があれば OK。
cron 自体が動作しているかも確認します。

sudo systemctl status crond

✅ systemd 方式の場合(CentOS7 以降など)

sudo systemctl status logrotate.timer

「active (waiting)」であれば正常です。
もし停止していれば再有効化します。

sudo systemctl enable --now logrotate.timer

4. ログファイルの権限確認

logrotate は対象ログの書き込み権限を必要とします。

ls -l /var/log/nginx/

もし root 以外が生成するログを root が処理しようとして失敗している場合は、設定内に su を追加します。

/var/log/nginx/*.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
    su nginx nginx
}

5. ローテーション実行ログの確認

実行履歴は /var/lib/logrotate/status に保存されています。

cat /var/lib/logrotate/status

ここに対象ログファイルの最終ローテーション日時が記録されています。
更新されていない場合は設定または cron/systemd の実行が止まっている可能性があります。

6. postrotate スクリプトのエラー確認

ローテーション後にサービスを再起動する設定が失敗している場合、全体が止まります。
以下のように出力を確認します。

sudo logrotate -f -v /etc/logrotate.conf

エラー例:

error running postrotate script

修正例:

postrotate
    systemctl reload nginx > /dev/null 2>&1 || true
endscript

|| true をつけることで、失敗しても logrotate 全体が停止しないようにします。

7. 最終確認:古いログが削除されるかテスト

sudo logrotate -f -v /etc/logrotate.conf

/var/log/nginx/.1, .2.gz のようなバックアップが生成されるか確認します。
その後、設定した rotate 数以上のログが削除されているか確認します。

まとめ:原因と解決方法対応表

原因解決方法コマンド例
設定ファイルの構文エラー-d オプションで構文チェックsudo logrotate -d /etc/logrotate.conf
cron/systemd timer が無効サービスを有効化sudo systemctl enable --now logrotate.timer
権限不足su オプションで実行ユーザー指定su nginx nginx を設定に追加
ログファイルのパスミス実在パスを再確認ls /var/log/<service>/
postrotate スクリプト失敗`
ローテーション履歴が更新されない/var/lib/logrotate/status を確認cat /var/lib/logrotate/status

補足

  • /etc/logrotate.conf では include /etc/logrotate.d によって個別設定を読み込みます。
    サービスごとの設定ミスも全体に影響するため、全設定を一度に検証することが重要です。
  • テスト時は -v(verbose)や -f(強制)を組み合わせると詳細に確認できます。
目次