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
コメント