logrotate は、ログファイルを一定の条件(サイズ・日付・世代数など)で分割(ローテート)・圧縮・削除し、必要に応じてサービスにログ再オープンを通知するユーティリティです。
実務では /etc/logrotate.d/ で各サービスのルールを管理し、日次のバッチ(systemd timer や cron)で定期実行します。
構文(Syntax)
logrotate [OPTION...] [CONFIG]
# 代表例
logrotate /etc/logrotate.conf
logrotate -d /etc/logrotate.conf # ドライラン(動作確認)
logrotate -f /etc/logrotate.d/APP.conf # 強制ローテート
CONFIGを省略すると通常は/etc/logrotate.confが使われます。- 挙動の多くは設定ファイルのディレクティブで制御します(例:
weekly,rotate 4,compress,create,postrotate ... endscriptなど)。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-d, --debug | ドライラン。実際には変更せず処理内容を表示 | logrotate -d /etc/logrotate.conf |
-f, --force | 条件を満たさなくても強制ローテート | logrotate -f /etc/logrotate.d/nginx |
-v, --verbose | 詳細ログを表示 | logrotate -v /etc/logrotate.conf |
-s FILE, --state FILE | ステートファイル(最後に回した時刻等)を指定 | logrotate -s ./logrotate.state my.conf |
-l FILE, --log FILE | logrotate 自体の実行ログを書き出し | logrotate -l /var/log/logrotate-run.log /etc/logrotate.conf |
--version / --help | 版本/ヘルプを表示 | logrotate --version |
参考: ディレクティブ(
weekly,size,rotate,compress,delaycompress,copytruncate,create,olddir,dateext,missingok,notifempty,su USER GROUP,postrotateなど)は設定ファイル側で指定します。
実行例
1) まずは安全にドライランで確認
説明: 何が行われるかをシミュレーションして確認します。
コマンド:
sudo logrotate -d /etc/logrotate.conf
出力例(例):
reading config file /etc/logrotate.conf
including /etc/logrotate.d
...
considering log /var/log/nginx/access.log
rotating pattern: weekly (4 rotations)
compress enabled, delaycompress enabled
...
2) 個別ルールを強制ローテート(テストや緊急時)
説明: 条件未達でも今すぐローテートしたい時に使います。
コマンド:
sudo logrotate -v -f /etc/logrotate.d/nginx
出力例(例):
rotating log /var/log/nginx/access.log, log->rotateCount is 4
renaming /var/log/nginx/access.log to /var/log/nginx/access.log.1
creating new /var/log/nginx/access.log mode = 0640 uid = 0 gid = 0
compressing log with: /bin/gzip
3) 独自ステート/ログを使って手元で検証
説明: 本番のステートを汚さず、ローカルの状態ファイルで挙動確認。
コマンド:
sudo logrotate -s ./logrotate.state -l ./logrotate-run.log -v /etc/logrotate.conf
4) 典型的な設定ファイル例(アプリ専用)
説明: アプリのログを週次・4世代保持・gzip圧縮し、ローテート後にプロセスへ HUP を送って再オープンさせます。/etc/logrotate.d/myapp の内容:
/var/log/myapp/*.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
dateext
sharedscripts
postrotate
# アプリが対応していれば、ログ再オープンを通知
# 例: systemd 管理なら reload、または HUP シグナル
systemctl reload myapp.service >/dev/null 2>&1 || true
# 代替例: kill -HUP $(pidof myapp) || true
endscript
}
5) エラー例:非特権ユーザーで実行し書き込みに失敗
説明: 権限がないとステートファイルへの書き込みや log の create が失敗します。
コマンド:
logrotate -f /etc/logrotate.d/rsyslog
出力例(例):
error: error creating output file /var/log/syslog: Permission denied
error: could not write state file /var/lib/logrotate/status: Permission denied
対処: sudo で実行、または su USER GROUP ディレクティブで適切な権限に切替。
関連コマンド
gzip/xz:compressディレクティブで使われる圧縮コマンド。systemctl: ローテート後にサービスへreload/HUPを通知。journalctl: systemd-journald のバイナリログを管理(--vacuum-size等で独自にローテート)。newsyslog: BSD 系のローテーションツール(類似機能)。cat/zcat: ローテート後のログ確認や圧縮ログの閲覧に利用。
備考
- 実行トリガー: 近年の多くのディストリでは
systemdのlogrotate.timerにより日次で起動します。古い/最小構成では/etc/cron.daily/logrotateが使われることもあります。 - 設定ファイルの構成:
- ルート:
/etc/logrotate.conf(ここでinclude /etc/logrotate.dが一般的) - 個別:
/etc/logrotate.d/*(各サービスのルール)
- ルート:
- ステートファイル: ローテート実行履歴を保持します(例: Debian系
/var/lib/logrotate/status、RHEL系/var/lib/logrotate/logrotate.status)。-sで変更可。 copytruncateの注意: 稼働中のプロセスを止めずにファイルをコピーしてから空にしますが、短時間のログ欠落が起こり得ます。可能ならpostrotateで再オープン(HUP/Reload)させるのが安全です。- 権限・所有者: 新規ログの作成は
create MODE USER GROUPで制御。root 以外が書く場合はsu USER GROUPを使います。 - サイズ/日付条件:
size 100M、daily/weekly/monthlyなどは併用可。両方満たした時に回すか、どちらかで回すかは実装仕様に依存する部分があるため、要件に合わせてテストしてください。 - 多量のログ:
olddir DIRでローテート先を分離し、dateext/dateformatで命名を安定化すると運用しやすくなります。
参考
- manページ(コマンド):
man 8 logrotate - manページ(設定ファイル書式):
man 5 logrotate.conf - プロジェクト(ソース・Issue・README): https://github.com/logrotate/logrotate
- systemd timer/サービスの確認:
systemctl status logrotate.timer/systemctl status logrotate.service

コメント