logrotate
『logrotate』は Linux のログファイルを自動的にローテーション・圧縮・削除するツールです。『/etc/logrotate.conf』がグローバル設定ファイルで、『/etc/logrotate.d/』ディレクトリ以下にアプリケーションごとの設定ファイルを置きます。『daily』、『weekly』、『size』で回転タイミングを指定し、『compress』で古いログを gzip 圧縮、『postrotate』でローテーション後にデーモンを再起動するといった処理を記述できます。
構文
# -----------------------------------------------
# /etc/logrotate.d/ 設定ファイルの基本構造
# -----------------------------------------------
# {ログファイルのパス} {
# ローテーションの頻度
# 保存世代数
# 圧縮オプション
# エラー処理オプション
# ローテーション後に実行するスクリプト
# }
/var/log/kyo-app/*.log {
# -----------------------------------------------
# ローテーションの頻度(いずれか1つを指定)
# -----------------------------------------------
# daily → 毎日ローテーションします
# weekly → 毎週ローテーションします
# monthly → 毎月ローテーションします
# size {N} → ファイルサイズが N を超えたときにローテーションします
# 単位: k(キロバイト)/ M(メガバイト)/ G(ギガバイト)
# 例: size 100M
daily
# -----------------------------------------------
# 保存世代数
# -----------------------------------------------
# rotate {N}
# → ローテーション済みファイルを N 世代分保持します
# → N+1 世代目のファイルは自動的に削除されます
rotate 7
# -----------------------------------------------
# 圧縮設定
# -----------------------------------------------
# compress
# → ローテーション済みログを gzip で圧縮します(.gz)
compress
# delaycompress
# → 直近1世代は圧縮せず、その次のローテーション時に圧縮します
# → ログを書き続けているプロセスがいる場合に使用します
delaycompress
# -----------------------------------------------
# エラー処理・空ファイル処理
# -----------------------------------------------
# missingok
# → 対象ログファイルが存在しなくてもエラーにしません
missingok
# notifempty
# → ログファイルが空の場合はローテーションをスキップします
notifempty
# -----------------------------------------------
# ファイル作成設定
# -----------------------------------------------
# create {パーミッション} {オーナー} {グループ}
# → ローテーション後に新しいログファイルを作成します
create 0640 www-data www-data
# dateext
# → ローテーション済みファイルのサフィックスを番号でなく日付にします
# → 例: app.log.2026-03-25.gz
dateext
# -----------------------------------------------
# ローテーション後に実行するスクリプト
# -----------------------------------------------
# postrotate ... endscript
# → ローテーション完了後に実行するシェルスクリプトを記述します
# → デーモンへのシグナル送信(ログファイルを再オープンさせる)に使います
postrotate
systemctl reload kyo-app 2>/dev/null || true
endscript
}
# -----------------------------------------------
# copytruncate を使う場合(プロセス再起動が困難な場合)
# -----------------------------------------------
/var/log/mai-app/*.log {
daily
rotate 14
compress
missingok
notifempty
# copytruncate
# → ファイルをコピーしてから元ファイルをゼロバイトに切り詰めます
# → ファイルディスクリプタを開いたままのプロセスへの影響を最小化します
# → postrotate でデーモンを再起動できない場合に使用します
copytruncate
}
# -----------------------------------------------
# su ディレクティブを使う場合
# -----------------------------------------------
/var/log/terry-app/*.log {
daily
rotate 30
compress
missingok
# su {ユーザー} {グループ}
# → logrotate 自体をこのユーザー権限で実行します
# → root 以外のユーザーが所有するログに対して使用します
su terry terry
postrotate
kill -HUP $(cat /var/run/terry-app.pid) 2>/dev/null || true
endscript
}
構文一覧
| ディレクティブ | 説明 |
|---|---|
daily | 毎日ローテーションします。 |
weekly | 毎週ローテーションします。 |
monthly | 毎月ローテーションします。 |
size {N} | ファイルサイズが N(例: 100M)を超えたときにローテーションします。頻度指定より優先されます。 |
rotate {N} | ローテーション済みファイルを N 世代分保持します。N+1 世代目は自動削除されます。 |
compress | ローテーション済みログを gzip で圧縮します。 |
delaycompress | 直近1世代の圧縮を次回まで遅延します。『compress』と組み合わせて使用します。 |
missingok | 対象ログファイルが存在しなくてもエラーにしません。 |
notifempty | ログファイルが空の場合はローテーションをスキップします。 |
create {パーミッション} {ユーザー} {グループ} | ローテーション後に指定した権限で新しいログファイルを作成します。 |
dateext | ローテーション済みファイルのサフィックスを連番でなく日付(例: .2026-03-25)にします。 |
postrotate / endscript | ローテーション完了後に実行するシェルスクリプトを記述します。デーモンへのシグナル送信などに使います。 |
prerotate / endscript | ローテーション実行前に走らせるスクリプトを記述します。 |
copytruncate | 元ファイルをコピーしてゼロバイトに切り詰めます。プロセスを再起動できない場合に使用します。 |
su {ユーザー} {グループ} | logrotate をこのユーザー権限で実行します。root 以外が所有するログに対して指定します。 |
sharedscripts | ワイルドカードで複数ファイルを指定した場合でも『postrotate』を1回だけ実行します。 |
dateformat {書式} | 『dateext』の日付フォーマットを指定します(例: -%Y%m%d)。 |
maxage {N} | N 日を超えたローテーション済みファイルを削除します。 |
minsize {N} | ファイルサイズが N に満たない場合はローテーションしません。頻度条件と AND で評価されます。 |
使用例
/etc/logrotate.d/kyo-app(アプリケーションログのローテーション設定)
# -----------------------------------------------
# 草薙京のWebアプリケーション用 logrotate 設定
# /etc/logrotate.d/kyo-app
# -----------------------------------------------
/var/log/kyo-app/access.log
/var/log/kyo-app/error.log {
# 毎日ローテーションします
daily
# 30世代分(約1ヶ月分)保持します
rotate 30
# ローテーション済みログを gzip で圧縮します
compress
# 直近1世代は圧縮を遅らせます
# (アプリが書き込み中のファイルが圧縮されないようにするためです)
delaycompress
# ログファイルが存在しなくてもエラーにしません
missingok
# 空ファイルはスキップします
notifempty
# ローテーション後に新しいファイルを作成します
create 0640 www-data www-data
# ファイル名に日付を付けます(例: access.log-2026-03-25.gz)
dateext
# ワイルドカード指定時も postrotate を1回だけ実行します
sharedscripts
# ローテーション後に Nginx へ USR1 シグナルを送り
# ログファイルを再オープンさせます
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) 2>/dev/null || true
endscript
}
実行するコマンドは次の通りです。
$ sudo logrotate -d /etc/logrotate.d/kyo-app WARNING: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want. reading config file /etc/logrotate.d/kyo-app Allocating hash table for state file, size 64 entries Adding /var/log/kyo-app/access.log Adding /var/log/kyo-app/error.log Handling 2 logs rotating pattern: /var/log/kyo-app/access.log after 1 days (30 rotations) empty log files are not rotated, old logs are removed considering log /var/log/kyo-app/access.log log does not need rotating (log has been already rotated) rotating pattern: /var/log/kyo-app/error.log after 1 days (30 rotations) empty log files are not rotated, old logs are removed considering log /var/log/kyo-app/error.log log does not need rotating (log has been already rotated) $ sudo logrotate -v /etc/logrotate.d/kyo-app reading config file /etc/logrotate.d/kyo-app rotating log /var/log/kyo-app/access.log, log->rotateCount is 30 dateext suffix '-2026-03-25' glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' renaming /var/log/kyo-app/access.log.29.gz to /var/log/kyo-app/access.log.30.gz (rotatecount 30, logstart 1, i 29), ... compressing log with: /bin/gzip $ sudo logrotate --force /etc/logrotate.d/kyo-app (--force を付けると条件に関係なく強制的にローテーションします)
グローバル設定 /etc/logrotate.conf の確認と手動実行
# ----------------------------------------------- # /etc/logrotate.conf のデフォルト設定を確認します # ----------------------------------------------- cat /etc/logrotate.conf
実行するコマンドは次の通りです。
$ cat /etc/logrotate.conf # see "man logrotate" for details # global options do not affect preceding include directives # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may also be configured here
実装例は次の通りです。
# ----------------------------------------------- # 全設定を対象に logrotate を手動で実行します # ----------------------------------------------- # デバッグモード(実際には何もしません)で全設定を確認します sudo logrotate -d /etc/logrotate.conf # ローテーション済みファイルの一覧を確認します ls -lh /var/log/kyo-app/ # 状態ファイル(最終ローテーション日時の記録)を確認します cat /var/lib/logrotate/status | grep kyo-app
実行するコマンドは次の通りです。
$ ls -lh /var/log/kyo-app/ total 2.1M -rw-r----- 1 www-data www-data 48K Mar 25 09:12 access.log -rw-r----- 1 www-data www-data 12K Mar 24 00:00 access.log-20260324.gz -rw-r----- 1 www-data www-data 9K Mar 23 00:00 access.log-20260323.gz -rw-r----- 1 www-data www-data 3K Mar 25 09:12 error.log -rw-r----- 1 www-data www-data 1K Mar 24 00:00 error.log-20260324.gz $ cat /var/lib/logrotate/status | grep kyo-app "/var/log/kyo-app/access.log" 2026-3-25-0:0:0 "/var/log/kyo-app/error.log" 2026-3-25-0:0:0
概要
『logrotate』は cron または systemd タイマー(『logrotate.timer』)によって定期的に呼び出されます。ログファイルが際限なく増大するのを防ぎ、古いログを圧縮・削除することでディスク使用量を管理します。設定は『/etc/logrotate.conf』にグローバルなデフォルト値を記述し、『/etc/logrotate.d/』以下のファイルでアプリケーションごとに上書きするのが一般的です。『logrotate -d』のデバッグモードを活用すると設定が正しく認識されているかを安全に確認できます。ローテーション後にデーモンへシグナルを送る『postrotate』ブロックを忘れると、デーモンが古いファイルディスクリプタにログを書き続けるため注意が必要です。実際のシステムログの閲覧には journalctl も合わせて活用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。