インフラ作業支援ラボInfra Support Lab← ガイド一覧← 戻る
問題発生時のトラブル解決ガイド

logrotateでログがローテーションされない原因と確認手順

このページの目的

ローテーションされない理由を、設定未読込み、対象外判定、権限・スクリプト失敗の3段階に分けます。最終的なゴールは、logrotate -dの判定理由を読み、修正すべき設定を特定することです。

最初にやること

最初に logrotate -d で設定の読込みと判定理由を確認します。強制実行から始めず、対象ログ、条件、状態ファイル、権限の順に確認します。

このページの対象:このページは「ログファイル自体が切り替わらない」場合が対象です。ローテーションは成功したのにアプリが新しいログへ書かない場合は、logrotate後にログを書かないガイドを確認してください。

ローテーションされないときの最短チェック

1. 設定と判定理由を見る

sudo logrotate -d /etc/logrotate.conf
-d はログやstateを変更せず、設定読込と判定理由を確認する入口です。

2. 実行経路を確認する

systemd環境では systemctl status logrotate.timersystemctl status logrotate.service を確認。環境によってcron等で実行されます。

3. 前回の判定状態を見る

stateファイルの場所を確認し、対象ログの前回ローテーション時刻と条件を照合します。

4. 強制実行は最後にする

-f は実際にローテーションを実行し得ます。まず -d、必要なら検証環境や専用stateで -v を使います。

「logrotateが動いていない」のか「動いたが対象外なのか」を分ける:タイマー・cron等の実行経路と、logrotate -d の判定結果を別々に確認すると、原因を早く絞れます。

logrotate設定を実行前に確認

設定を貼り付けて、対象パス、世代数、圧縮、create、copytruncate、postrotateなどの注意点を確認できます。

logrotate設定をレビュー

最初に判定理由を確認する

強制実行する前に、デバッグ出力を次の3つに分けて読みます。

sudo logrotate -d /etc/logrotate.conf

よくある表示・症状から原因を絞る

表示された文言は原因そのものではなく、確認範囲を絞る手掛かりです。「考えられる原因」と「最初の確認方法」を対応させて確認します。

エラー・症状考えられる原因最初の確認方法
error: bad rotation count / unknown option設定値の形式誤り、または未対応・誤記したディレクティブlogrotate -d の該当行と対象設定ファイルを確認
error: skipping "..." because parent directory has insecure permissions親ディレクトリが第三者書込み可能で、su指定もない親ディレクトリの所有者・権限とsu指定を確認
error: stat of ... failed: No such file or directory対象ログのパス誤り、またはログファイルがまだ存在しないls -l とlogrotate設定内の対象パスを照合
log does not need rotating期間・サイズ条件が未到達、または状態ファイル上で実行時期前-d出力の判定理由とstatusファイルを確認
error running shared postrotate scriptpostrotate内のコマンドが失敗し、非0で終了したpostrotateのコマンドを単体実行し終了コードを確認
duplicate log entry for ...同じログパスが複数の設定ブロックで指定されている/etc/logrotate.conf とinclude先を検索して重複を確認

原因を切り分ける確認手順

  1. 設定が読み込まれているか確認する

    grep -n "include" /etc/logrotate.conf ls -l /etc/logrotate.d/

    対象ファイルがinclude先にあり、ファイル名や権限が実装・ディストリビューションの要件を満たすか確認します。

  2. logrotate自体が定期実行されているか確認する

    systemctl status logrotate.timer --no-pager 2>/dev/null || true systemctl list-timers --all | grep -i logrotate || true systemctl status logrotate.service --no-pager 2>/dev/null || true

    systemdを使う環境では logrotate.timer から起動される構成があります。別のcronやジョブ管理で起動する環境もあるため、実際の実行方式を確認します。

  3. 対象ログと条件を確認する

    ls -lh /var/log/example/app.log sudo logrotate -d /etc/logrotate.conf

    dailysizeminsizenotifemptyなどの条件で対象外になっていないか確認します。

  4. 状態ファイルを確認する

    sudo grep -F '/var/log/example/app.log' /var/lib/logrotate/logrotate.status 2>/dev/null || true

    状態ファイルの場所は環境で異なります。前回ローテーション時刻を確認します。

  5. 権限と所有者を確認する

    namei -l /var/log/example/app.log ls -ld /var/log/example /var/log/example/app.log

    logrotateの実行主体と、sucreateの指定が整合しているか確認します。

  6. postrotateを単独確認する

    systemctl reload example.service systemctl status example.service --no-pager

    設定に書いた再読込処理が対象アプリで本当に有効か、単独で確認します。

確認結果から次の対応を決める

デバッグ結果主な対応
log does not need rotating期間・サイズ・状態ファイルを確認します。
error opening ... Permission denied親ディレクトリ、ファイル権限、suを確認します。
ローテーション済みだがアプリが旧ファイルへ書くpostrotateで再オープン通知するか、アプリ仕様に応じて方式を見直します。
新しいログへ書けないcreateのモード・所有者・グループを確認します。
設定は正しいが定期実行されていないlogrotate.timer / cron / ジョブ管理の実行状態とログを確認します。

この症状で多い原因

copytruncateが気になる

方式を変える前に、通常ローテーション・postrotateとの違いとリスクを確認します。

copytruncateとpostrotateを比較 →
切替後だけ書込みがおかしい

ローテーション自体は成功している場合は別の切り分けです。

書込み停止の原因を確認 →
設定全体を実行前レビュー

個別原因の調査と並行して設定の注意点を確認できます。

設定をレビュー →

修正後の確認と再発防止

影響を理解したうえで、個別設定と専用の一時状態ファイルを使って検証すると、本番の状態ファイルを汚しにくくなります。

sudo logrotate -d /etc/logrotate.d/example sudo logrotate -v -s /tmp/logrotate-test.status /etc/logrotate.d/example
-fによる強制実行は、ログの切替、圧縮、削除、postrotateを実行する可能性があります。本番ログではバックアップと影響確認を先に行ってください。

logrotate設定を実行前に確認

設定を貼り付けて、対象パス、世代数、圧縮、create、copytruncate、postrotateなどの注意点を確認できます。

logrotate設定をレビュー