インフラ作業支援ラボInfra Support Lab← 作業ガイド← 戻る

logrotate設定値の意味と安全な設定方法

このページの目的:logrotate適用前に、保存条件・権限・ログ再オープンを確認し、ログ欠損を防ぐ

このページで分かること

  • 基本ディレクティブの意味
  • 設定例が実際にどう動くか
  • 主要ディレクティブと指定値の意味
  • copytruncatepostrotateの違い
  • 問題発生時の案内
  • デバッグ・強制実行の使い分け

先に結論

logrotateは保存世代や圧縮だけでなく、新しいログの権限とアプリ側のログ再オープンまで設計します。適用前は logrotate -d で判定内容を確認し、強制実行は影響を理解してから行います。

logrotate設定をすぐ確認する

自分の設定を貼り付けて、権限、保存世代、copytruncate、postrotateなどの注意点を実行前に確認できます。

logrotateレビューを使う

基本設定例

/var/log/example/app.log { daily rotate 14 compress delaycompress missingok notifempty create 0640 appuser appgroup postrotate systemctl kill -s HUP example.service endscript }
設定意味
daily日次でローテーション判定
rotate 14過去14世代を保持
compress古いログを圧縮
missingok対象ログがなくてもエラーにしない
notifempty空ファイルはローテーションしない
createローテーション後の新規ログの権限・所有者を指定
この設定例の動作: /var/log/example/app.logを日次で確認し、空でなければローテーションします。最大14世代を保持し、古い世代は圧縮します。ローテーション直後に権限0640、所有者appuser:appgroupの新しいapp.logを作成し、最後にサービスへHUPシグナルを送り、新しいログファイルを開き直させる構成です。

設定例を1行ずつ読む

設定例この例での動作
/var/log/example/app.logローテーション対象のログファイルです。このファイルだけに波括弧内の設定が適用されます。
daily前回のローテーションから日次条件を満たしたか判定します。logrotate自体が1日1回以上実行される環境が前提です。
rotate 14ローテート済みログを14世代保持します。15世代目以降は削除対象になります。
compress古いローテート済みログをgzipなどで圧縮し、保存容量を抑えます。
delaycompress直前にローテーションした1世代は圧縮せず、さらに次の実行時に圧縮します。この例では通常、直近のapp.log.1は非圧縮、より古い世代はapp.log.2.gzのようになります。
missingok対象のapp.logが存在しなくてもエラー扱いにせず、処理を継続します。
notifemptyapp.logが0バイトならローテーションしません。空の世代ファイルが増えるのを防ぎます。
create 0640 appuser appgroup元のログをrenameした後、所有者が読み書き、グループが読み取り可能な新しいapp.logを作成します。その他ユーザーには権限を与えません。
postrotateendscriptローテーション後に囲まれたコマンドを実行します。この例ではサービスへHUPを送ります。
systemctl kill -s HUP example.serviceexample.serviceのプロセスへHUPシグナルを送り、アプリに新しいapp.logを開き直させます。アプリがHUPによる再オープンに対応していることが前提です。
この例の注意点: dateextを指定していないため、保存ファイル名は通常app.log.1app.log.2.gzのような世代番号形式になります。また、HUPに対応していないアプリへこの例をそのまま使うと、古いファイルへ書き続けたり動作に影響したりする可能性があります。

主要な設定値の意味

logrotateは「いつ回すか」「何世代残すか」「回した後にアプリへ何をさせるか」を組み合わせて設定します。頻度とサイズ条件の違い、権限、スクリプトの実行単位を理解しておくことが重要です。

ローテーションの頻度・条件

設定主な値・例意味と注意点
hourly / daily / weekly / monthly / yearlyいずれか1つ時間、日、週、月、年単位でローテーションを判定します。logrotate自体の実行頻度より細かい周期を指定しても、その頻度では動きません。
rotaterotate 14保持する世代数です。0では古いログを保持しません。容量設計では1世代あたりの最大サイズも考慮します。
sizesize 100M指定サイズを超えたらローテーションします。時間間隔の指定とは相互排他的で、両方を書いた場合は設定内で後に記述された指定が優先されます。
minsizeminsize 10M時間条件を満たし、かつ指定サイズ以上の場合だけローテーションします。
maxsizemaxsize 500M通常の時間条件を待たず、指定サイズを超えた時点でローテーション対象にします。ただし実際の判定はlogrotateが実行された時です。
maxagemaxage 30そのログがローテーションされるタイミングで、指定日数より古いローテート済みログを削除します。logrotateが実行されただけでは常に削除されるわけではありません。世代数と併用する場合は両方の条件を確認します。

ファイルがない・空の場合の扱い

設定意味使い分け
missingok対象ログがなくてもエラーにしないログが常に存在するとは限らないサービス向けです。
nomissingok対象ログがない場合をエラーにする既定動作です。存在必須のログの設定ミスを検知しやすくなります。
notifempty空ファイルはローテーションしない空の世代を増やしたくない場合に使います。
ifempty空ファイルでもローテーションする既定動作です。周期ごとのファイル生成が必要な運用で使います。

圧縮・ファイル名・保存場所

設定主な値・例意味と注意点
compress / nocompress指定のみローテート済みログを圧縮するか選びます。CPU負荷と保存容量のバランスを確認します。
delaycompress指定のみ直前の1世代は圧縮せず、次回ローテーション時に圧縮します。アプリが古いログへ少しの間書き続ける場合に有効ですが、compressと組み合わせます。
dateext指定のみ.1ではなく日付を付けて保存します。
dateformat-%Y%m%dなどdateext使用時のファイル名形式です。並び順や重複しない形式を確認します。
extensionextension .log拡張子をローテーション後のファイル名末尾に残すために使います。
olddir保存先ディレクトリローテート済みログを別ディレクトリへ移動します。通常は同一ファイルシステム上に置き、権限と容量を確認します。

新しいログファイルの作成と実行権限

設定主な値・例意味と注意点
createcreate 0640 appuser appgroup元ログをrenameした後、新しい空ログを指定モード・所有者・グループで作成します。アプリがその新ファイルへ書けることを確認します。
nocreate指定のみローテーション後に新しいログを作りません。アプリ自身が再作成する場合などに使います。
susu appuser appgroup指定ユーザー・グループとしてローテーション処理を行います。親ディレクトリがroot以外から書き込み可能な場合など、権限エラーや安全性の警告を避けるために重要です。
copytruncate指定のみ元ログをコピー後、そのファイルを0バイトへ切り詰めます。アプリの再オープンは不要ですが、コピーとtruncateの間のログが欠落する可能性があります。通常createは効果を持ちません。
copy指定のみログをコピーしますが、元ファイルは切り詰めません。別の処理で元ログを扱う設計向けです。

スクリプト実行の設定

設定実行タイミング注意点
prerotateendscript対象ログをローテーションする前事前準備に使います。失敗時の影響を確認し、長時間処理は避けます。
postrotateendscriptローテーション後アプリへのHUP送信やログ再オープンに使います。安易なサービス再起動は停止影響を生みます。
firstactionendscript対象パターン全体の処理前に1回少なくとも1つのログが対象になる場合に実行されます。
lastactionendscript対象パターン全体の処理後に1回複数ログをまとめた後処理に使います。
sharedscripts複数ログに対してスクリプトを1回実行ワイルドカードで複数ファイルを対象にする際、サービスへのHUPを何度も送らないために使います。
nosharedscripts各ログごとにスクリプトを実行既定動作です。対象数だけスクリプトが繰り返される点に注意します。
実行環境: ディストリビューションやlogrotateのバージョンにより利用可能な設定や状態ファイルの場所が異なります。対象環境ではman logrotatelogrotate --versionlogrotate -dで確認してください。

copytruncateとpostrotate

copytruncateは元のログファイルを維持して切り詰める方式、postrotateはローテーション後にアプリへログ再オープンを促す処理です。選択を誤るとログ欠損や停止影響につながります。

選び方を詳しく確認: 動作差、適用条件、確認手順はcopytruncateとpostrotateの違いで比較しています。

問題発生時の案内

この作業ガイドは、logrotate設定を適用する前の保存条件・権限・ログ再オープン設計を対象にしています。すでにローテーションされない場合は、設定読込・条件判定・処理失敗を分けて確認します。

ログがローテーションされない場合: logrotateでローテーションされない原因と確認手順で、logrotate -dの判定結果、状態ファイル、権限を順番に確認してください。

よくある失敗

確認コマンド

ls -l /var/log/example/ du -h /var/log/example/* systemctl status logrotate.timer journalctl -u logrotate.service --since today
logrotate後にアプリがログを書かなくなった場合は、旧ファイル記述子、create権限、postrotate、再オープンを確認します。

logrotate設定を実行前にレビュー

設定を貼り付けて、危険な権限、copytruncate、postrotate、保存世代などを確認できます。

logrotateレビューを使う