概要
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
ログファイルが空ならローテーションしない。 -
copytruncate
copy の動作を行った後、元のログファイルの内容を消去する。 -
create 0644 fuga fuga
ローテーションを行った後、代わりに空の新規ログファイルを作る。権限・グループ・ユーザを指定可能 -
postrotate~endscript
postrotateと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