1時間ごとにlogrotateする方法
ログファイル管理はlogrotateを使って週1回または1日1回ローテートするように仕掛けたらひとまずOK。だいたいのケースでは。
が、普通に設定したら最短で1日1回しかローテートできないので、ログファイルが数百MB、数GBと大きくなる場合にはOKとは言えない。 できれば1時間に1回ローテートできないものか。
単純な発想だが、1時間に1回、cronで強制的にローテート実行させることで可能である。 以下、logrotateの基本的な設定方法の確認の意味も込めて、手順をメモっておく。
1.アーカイブ先(olddir)作成
アーカイブ先を分けるのは必須ではないが、分けておくとログディレクトリ直下には常に最新のログのみが書き出されているのですっきりする。
# mkdir -p /var/log/nginx/archives
2.logrotate設定
毎時ローテートさせたいログファイル専用の設定ファイルを用意する。
# mkdir -p /etc/logrotate.hourly # vi /etc/logrotate.hourly/nginx
気をつけるのはローテートさせる回数とファイル名(日付・タイムスタンプ付にする)。 あとは好みに応じて設定。
/var/log/nginx/huge_access.log { create 0644 nginx nginx daily # cronで実行するため、実質的に意味なし rotate 720 # 1ヶ月保持出来るローテート回数(24回/日 × 30日) missingok notifempty compress dateext # ファイル名に日付を付ける dateformat -%Y%m%d-%s # 毎時生成されるためタイムスタンプを付ける olddir /var/log/nginx/archives sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript }
※dateext, dateformatの "%s" は、logrotateのバージョンによって使えない場合もある。
3. 設定テスト
-d デバッグモード(dry-runされて、ローテートされない)で実行し、設定エラーが出ないか確認
# logrotate -dv /etc/logrotate.hourly/nginx
4. 初回実行
新規にローテート対象となったファイルは、初回実行時に /var/lib/logrotate.status にエントリ追加されるだけでローテートされないので、cronでスケジュール実行される前に1回手動で実行する
# logrotate -v /etc/logrotate.d/logrotate.hourly/nginx
※1回目は、いずれのログも /var/lib/logrotate.status にエントリがない、または既に毎時ローテートされているファイル のどちらかのため、 dailyローテートのテストとしては、ローテート対象外(log does not need rotating)という結果になる。
5.ローテート履歴(logrotate.status) 確認
対象のログが、logrotate.status エントリに本日日付で入っていることを確認。
# cat /var/lib/logrotate.status logrotate state -- version 2 ・ ・ (略) "/var/log/nginx/huge_access.log" 2015-8-29 #←これ
6. cron設定
5までで、毎日3:00以降の任意のタイミング(cron.dailyの実行タイミング)でローテートが実施されるようにはなった。 ただ、これだけでは日次ローテートしかされないため、cronで毎時実行させる。
# logrotate -f で強制ローテート実行 0 * * * * /usr/sbin/logrotate -f -s /var/lib/logrotate.status /etc/logrotate.hourly/nginx
これで設定完了。
・・・と、これを書いている最中、既に3.8.5からhourly設定可能になっているという情報を見かけ。今度使ってみよ。
https://fedorahosted.org/logrotate/browser/tags/r3-8-8/CHANGES
参考
タイトルとか決めてないけどこのままでもいいかもしんない: logrotateでnginxのログを1時間ごとにローテートをする