Edited at

ログローテーションするためのlogrotate設定とちょっとしたtips

More than 3 years have passed since last update.


概要

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