logrotate設定値の意味と安全な設定方法
このページの目的:logrotate適用前に、保存条件・権限・ログ再オープンを確認し、ログ欠損を防ぐ
このページで分かること
- 基本ディレクティブの意味
- 設定例が実際にどう動くか
- 主要ディレクティブと指定値の意味
copytruncateとpostrotateの違い- 問題発生時の案内
- デバッグ・強制実行の使い分け
先に結論
logrotateは保存世代や圧縮だけでなく、新しいログの権限とアプリ側のログ再オープンまで設計します。適用前は logrotate -d で判定内容を確認し、強制実行は影響を理解してから行います。
logrotate設定をすぐ確認する
自分の設定を貼り付けて、権限、保存世代、copytruncate、postrotateなどの注意点を実行前に確認できます。
問題がすでに起きている場合:すでにログがローテーションされない場合は、専用のトラブル解決ガイドで設定読込・条件・状態ファイルを順に確認できます。 トラブル解決ガイドを見る →
基本設定例
/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が存在しなくてもエラー扱いにせず、処理を継続します。 |
notifempty | app.logが0バイトならローテーションしません。空の世代ファイルが増えるのを防ぎます。 |
create 0640 appuser appgroup | 元のログをrenameした後、所有者が読み書き、グループが読み取り可能な新しいapp.logを作成します。その他ユーザーには権限を与えません。 |
postrotate~endscript | ローテーション後に囲まれたコマンドを実行します。この例ではサービスへHUPを送ります。 |
systemctl kill -s HUP example.service | example.serviceのプロセスへHUPシグナルを送り、アプリに新しいapp.logを開き直させます。アプリがHUPによる再オープンに対応していることが前提です。 |
この例の注意点:
dateextを指定していないため、保存ファイル名は通常app.log.1、app.log.2.gzのような世代番号形式になります。また、HUPに対応していないアプリへこの例をそのまま使うと、古いファイルへ書き続けたり動作に影響したりする可能性があります。主要な設定値の意味
logrotateは「いつ回すか」「何世代残すか」「回した後にアプリへ何をさせるか」を組み合わせて設定します。頻度とサイズ条件の違い、権限、スクリプトの実行単位を理解しておくことが重要です。
ローテーションの頻度・条件
| 設定 | 主な値・例 | 意味と注意点 |
|---|---|---|
hourly / daily / weekly / monthly / yearly | いずれか1つ | 時間、日、週、月、年単位でローテーションを判定します。logrotate自体の実行頻度より細かい周期を指定しても、その頻度では動きません。 |
rotate | rotate 14 | 保持する世代数です。0では古いログを保持しません。容量設計では1世代あたりの最大サイズも考慮します。 |
size | size 100M | 指定サイズを超えたらローテーションします。時間間隔の指定とは相互排他的で、両方を書いた場合は設定内で後に記述された指定が優先されます。 |
minsize | minsize 10M | 時間条件を満たし、かつ指定サイズ以上の場合だけローテーションします。 |
maxsize | maxsize 500M | 通常の時間条件を待たず、指定サイズを超えた時点でローテーション対象にします。ただし実際の判定はlogrotateが実行された時です。 |
maxage | maxage 30 | そのログがローテーションされるタイミングで、指定日数より古いローテート済みログを削除します。logrotateが実行されただけでは常に削除されるわけではありません。世代数と併用する場合は両方の条件を確認します。 |
ファイルがない・空の場合の扱い
| 設定 | 意味 | 使い分け |
|---|---|---|
missingok | 対象ログがなくてもエラーにしない | ログが常に存在するとは限らないサービス向けです。 |
nomissingok | 対象ログがない場合をエラーにする | 既定動作です。存在必須のログの設定ミスを検知しやすくなります。 |
notifempty | 空ファイルはローテーションしない | 空の世代を増やしたくない場合に使います。 |
ifempty | 空ファイルでもローテーションする | 既定動作です。周期ごとのファイル生成が必要な運用で使います。 |
圧縮・ファイル名・保存場所
| 設定 | 主な値・例 | 意味と注意点 |
|---|---|---|
compress / nocompress | 指定のみ | ローテート済みログを圧縮するか選びます。CPU負荷と保存容量のバランスを確認します。 |
delaycompress | 指定のみ | 直前の1世代は圧縮せず、次回ローテーション時に圧縮します。アプリが古いログへ少しの間書き続ける場合に有効ですが、compressと組み合わせます。 |
dateext | 指定のみ | .1ではなく日付を付けて保存します。 |
dateformat | -%Y%m%dなど | dateext使用時のファイル名形式です。並び順や重複しない形式を確認します。 |
extension | extension .log | 拡張子をローテーション後のファイル名末尾に残すために使います。 |
olddir | 保存先ディレクトリ | ローテート済みログを別ディレクトリへ移動します。通常は同一ファイルシステム上に置き、権限と容量を確認します。 |
新しいログファイルの作成と実行権限
| 設定 | 主な値・例 | 意味と注意点 |
|---|---|---|
create | create 0640 appuser appgroup | 元ログをrenameした後、新しい空ログを指定モード・所有者・グループで作成します。アプリがその新ファイルへ書けることを確認します。 |
nocreate | 指定のみ | ローテーション後に新しいログを作りません。アプリ自身が再作成する場合などに使います。 |
su | su appuser appgroup | 指定ユーザー・グループとしてローテーション処理を行います。親ディレクトリがroot以外から書き込み可能な場合など、権限エラーや安全性の警告を避けるために重要です。 |
copytruncate | 指定のみ | 元ログをコピー後、そのファイルを0バイトへ切り詰めます。アプリの再オープンは不要ですが、コピーとtruncateの間のログが欠落する可能性があります。通常createは効果を持ちません。 |
copy | 指定のみ | ログをコピーしますが、元ファイルは切り詰めません。別の処理で元ログを扱う設計向けです。 |
スクリプト実行の設定
| 設定 | 実行タイミング | 注意点 |
|---|---|---|
prerotate ~ endscript | 対象ログをローテーションする前 | 事前準備に使います。失敗時の影響を確認し、長時間処理は避けます。 |
postrotate ~ endscript | ローテーション後 | アプリへのHUP送信やログ再オープンに使います。安易なサービス再起動は停止影響を生みます。 |
firstaction ~ endscript | 対象パターン全体の処理前に1回 | 少なくとも1つのログが対象になる場合に実行されます。 |
lastaction ~ endscript | 対象パターン全体の処理後に1回 | 複数ログをまとめた後処理に使います。 |
sharedscripts | 複数ログに対してスクリプトを1回実行 | ワイルドカードで複数ファイルを対象にする際、サービスへのHUPを何度も送らないために使います。 |
nosharedscripts | 各ログごとにスクリプトを実行 | 既定動作です。対象数だけスクリプトが繰り返される点に注意します。 |
実行環境: ディストリビューションやlogrotateのバージョンにより利用可能な設定や状態ファイルの場所が異なります。対象環境では
man logrotate、logrotate --version、logrotate -dで確認してください。copytruncateとpostrotate
copytruncateは元のログファイルを維持して切り詰める方式、postrotateはローテーション後にアプリへログ再オープンを促す処理です。選択を誤るとログ欠損や停止影響につながります。
選び方を詳しく確認: 動作差、適用条件、確認手順はcopytruncateとpostrotateの違いで比較しています。
問題発生時の案内
この作業ガイドは、logrotate設定を適用する前の保存条件・権限・ログ再オープン設計を対象にしています。すでにローテーションされない場合は、設定読込・条件判定・処理失敗を分けて確認します。
ログがローテーションされない場合: logrotateでローテーションされない原因と確認手順で、
logrotate -dの判定結果、状態ファイル、権限を順番に確認してください。よくある失敗
- 対象ログのパスが実際の出力先と違う
notifemptyにより空ログが対象外になっているsize条件や前回実行時刻を満たしていないcreateの所有者・権限がアプリと合っていない- アプリが古いファイルディスクリプタへ書き続ける
postrotateのコマンドが失敗している
確認コマンド
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、保存世代などを確認できます。