rails の環境で、 ログファイルを分割してゆくためにはActiveSupport::Logger
で定義する方法があります。
過去に、Rails でバッチ処理してみる 2 - ログの最大サイズを定義するでこの点は書いていました。
logrotate というパッケージがあり定義に基づいてログローテーションできるを知りました。
こちらの機能を確認したので、まとめておきます。
目次
動作環境
- CentOS7.7 (VirtualBox で用意)
設定
/etc/logrotate.d
にファイルを作成します。
今回は、nginx と rails のログローテーションを設定してみます。
/etc/logrotate.d/rails_app
は、各パラメータの説明を追加します。
/etc/logrotate.d/rails_app1 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/nginx1 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 など指定できるパラメータがあるので、また確認したいところです。
ではでは。