概要
Linuxの場合ログローテーションはlogrotateというrpmを用います
だいたいのディストリビューションには最初から入っているはずです。
設定もとても簡単で、ローテーションしたいファイルの指定と、
ローテーションする際の設定を数行書けば完了です。
準備
ログローテーションにはcronを用いてるため
crondが動いているかどうか確認
$ service crond status
ローテーション設定
/etc/logrotate.confと/etc/logrotate.d/配下のファイルによって設定します。
おそらく/etc/logrotate.d/配下に最初から幾つか設定ファイルがあるのでそれらも参考にすると良いでしょう。
例えばnginxの各種ログファイルのローテーション設定は
/var/log/nginx/*log {
create 0644 nginx nginx
daily
rotate 10
missingok
notifempty
compress
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
みたいな感じで設定できます。
使用できる主なコマンド
-
weeklyログローテーションを週毎に行う。 -
rotate 4ログローテーションの世代数を4個に設定。 -
missingok指定のログファイルが実在しなかったとしてもエラーを出さずに処理続行。 -
notifemptyログファイルが空ならローテーションしない。 -
copytruncatecopy の動作を行った後、元のログファイルの内容を消去する。 -
create 0644 fuga fugaローテーションを行った後、代わりに空の新規ログファイルを作る。権限・グループ・ユーザを指定可能 -
postrotate~endscriptpostrotateとendscriptの間に記述されたコマンドをログローテーション後に実行 -
size ファイルサイズログファイルが指定したファイルサイズ以上になったらローテーションする
その他設定項目は→@IT:logrotateの設定ファイルで指定できる主なコマンド
logrotateの動作確認
ShellScript - logrotateを手動実行 - Qiita
# デバッグ
/usr/sbin/logrotate -fd /etc/logrotate.d/nginx
# 実行
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
TIPS
ログを扱うアプリケーション側でログファイルを再openできない・するのが面倒
logrotateの通常の動作としては
hoge.log
があった場合、これをローテーションさせるには
hoge.log.1にリネームし、新たにhoge.logを生成します。
ただしデーモンで動作しているアプリケーション等の場合、開いているファイルはhoge.log.1なので、
hoge.logを再openしてあげる必要があります。
例えばUnicornの場合USR1シグナルを送信するとログファイルを再度openしてくれますが、
こういった便利なシグナルやコマンドが用意されていない場合はcopytruncateを用います。
copytruncateを記述しておくと
hoge.logがあった場合に、これをコピーしたものをローテーションのファイルhoge.log.1とし、
オリジナル(hoge.log)の中身を削除します。
つまりhoge.logを開きっぱなしにしておけばokということです!
参考
Nginx - ログローテーション設定! - mk-mode BLOG
Ruby on Rails - Unicorn のログローテーション! - mk-mode BLOG