ログローテーションを考える

rails の環境で、 ログファイルを分割してゆくためにはActiveSupport::Loggerで定義する方法があります。
過去に、Rails でバッチ処理してみる 2 - ログの最大サイズを定義するでこの点は書いていました。

logrotate というパッケージがあり定義に基づいてログローテーションできるを知りました。
こちらの機能を確認したので、まとめておきます。

目次

動作環境

  • CentOS7.7 (VirtualBox で用意)

設定

/etc/logrotate.dにファイルを作成します。
今回は、nginx と rails のログローテーションを設定してみます。
/etc/logrotate.d/rails_appは、各パラメータの説明を追加します。

/etc/logrotate.d/rails_app
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/root/testapp4/log/*.log{
# ログローテーションの感覚設定
# hourly daily weekly monthly を選択できる
# hourly を設定してもlogrotateは日次実行されるのが通常なので、
# cp -p /etc/cron.daily/logrotate /etc/cron.hourly/logrotate で毎時実行のcronにlogrotateを追加する
daily

# ローテーションしたファイル名の末尾に日付をつける
# デフォルトでは末尾に数字が付与される
dateext

# ログの保持個数を定義する
rotate 10

# ログファイルが無くてもエラーにしない
missingok

# ログファイルを.gz形式で圧縮
compress

# 圧縮のタイミングが次回になる
# a.log a.log.1 a.log.2.gz のようになる
delaycompress

# ローテーション後に対象のファイルを指定した権限で再作成
# a.logをa.log.1にした後、a.logを再作成する
create 0655 root root

# 複数のログファイルを指定するように*を使用した時すべてのファイルに対してpostrotateに定義したコマンドを実行する
sharedscripts

# postrotateからendscripにあるコマンドを実行する
postrotate
# プロセスを再起動しないと、ファイル名変更されたファイルに書き込みを続けてしまった
# killするプロセスは自動起動するようにしておく必要がある
/bin/kill -HUP `cat /root/testapp/tmp/pids/server.pid 2> /dev/null` 2> /dev/null || true
endscript
}
/etc/logrotate.d/nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/nginx/*.log {
daily
dateext
rotate 10
missingok
compress
delaycompress
create 0655 root root
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || true
endscript
}

ログローテーションを、アプリケーション本体には含まないほうが実装はシンプルになるし、責任が分担されていていいなと思いました。
ほかにも size など指定できるパラメータがあるので、また確認したいところです。

ではでは。