概要
Linux サーバーではログファイルの肥大化を防ぐために、logrotate
による定期的なローテーションが行われます。
しかし設定ミスや権限、cron の不具合などにより、古いログが削除されない/圧縮されない/ローテーションが実行されない ことがあります。
この記事では、問題の原因と具体的な修復手順を整理します。
主な原因と現象
原因 | 現象・症状 |
---|---|
logrotate の設定ファイルに構文エラー | logrotate 実行時にエラーが出て処理が途中で止まる |
cron / systemd timer が動作していない | 自動ローテーションが実行されない |
ログファイルのパーミッションが不正 | ローテーション時に permission denied が発生 |
ログファイルパスの指定ミス | 実際のログファイルが対象外で古いログが残る |
missingok や notifempty の設定不足 | ログが存在しない・空のときにエラー終了する |
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
(強制)を組み合わせると詳細に確認できます。