賢くなりたいトイプードルの日記

データサイエンス系の話をメインにしていきます

AWSでRuby On Railsアプリのログローテーションを設定するやり方

AWSは本当に便利で素晴らしくて未来的なクラウドサーバーシステムです。ログローテーションも簡単に行うことができます。

まだAWSでセキュアな環境を構築できてないという方は以下の記事をご参考にしてみてください。

ログローテーションを設定していないとどうなる?

自分もついこの間(2018年の仕事納めの日)、アクセスが集中してサーバーがダウンしてしまったのですが、
これはアクセスの集中が根本的な原因ではありませんでした。

年末のアクセス増加によってログが一気に増え、結果データ容量がなくなってしまったのです。

もちろんログ・ファイルを消せば良いのですが、定期的に確認しなければならないのはめんどくさいですし、なにかあった時にログを確認しなければいけないですよね。そこでログローテーションがソリューションになります。

ログローテーションとは?

自動で一定の期間のログ・ファイルを日毎に残し、期間外のログ・ファイルを削除することです。

AWSであれば、これをとても簡単に行うことができます。

AWSでログローテーションを設定する方法

production環境で説明していきます。

production.logのログローテーション

config/environments/production.rbに

config.logger = Logger.new("log/production.log", 'weekly')

の一行を追加します。これでproduction.logは一週間より前のものは切り捨てるように変更できました。

Unicornのログローテーション

/etc/logrotate.d配下に「unicorn」というファイルを作成して、以下を記述します。

/var/www/rails/mystore/shared/log/unicorn.*.log {
  daily                     # ログローテーションを毎日に行う
  missingok                 # ログファイルが存在しなくてもエラーを出さずに処理を続行
  rotate 3                  # 3世代ログを残す
  notifempty                # ログファイルが空ならローテーションしない
  create 0640 myuser mygroup # パーミッション user group

  # unicorn masterプロセスに、USR1シグナルを送る
  lastaction
    pid=/var/www/rails/contents-store/shared/tmp/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
  endscript
}

AWSの環境によって違いがあると思うので、

  • /var/www/rails/mystore/shared/log/unicorn.*.log
  • pid=/var/www/rails/contents-store/shared/tmp/pids/unicorn.pid
  • create 0640 myuser mygroup

の3行は各自変更してください。

Nginxのログローテーション

/etc/logrotate.d/nginxを作成して、以下を記述

/var/log/nginx/*log {
    create 0644 myuser mygroup
    daily
    rotate 3
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /etc/init.d/nginx reopen_logs
    endscript
}

Sidekiqのログローテーション

/etc/logrotate.d/sidekiqを作成して以下を記述

/var/www/rails/mystore/shared/log/sidekiq.log {
  daily
  missingok
  rotate 3
  size 10M
  dateext
  notifempty
  copytruncate

  compress
  delaycompress

  lastaction
    unicorn_pid=/var/www/rails/mystore/shared/tmp/pids/unicorn.pid
    test -s $unicorn_pid && kill -USR1 "$(cat $unicorn_pid)"

    sidekiq_pid=/var/www/rails/mystore/shared/tmp/pids/sidekiq-0.pid
    test -s $sidekiq_pid && kill -USR2 "$(cat $sidekiq_pid)"
  endscript
}

Redisのログローテーション

/etc/logrotate.d/redisを作成して以下を記述

/var/log/redis/*.log { 
     daily
     missingok 
     rotate 3
     compress
     delaycompress
     notifempty
     create 0640 myuser mygroup
} 

ログローテーションを反映させるコマンド

最後に以下のコマンドを叩いて、ログローテーションを反映させます。

$ logrotate -d /etc/logrotate.conf

まとめ


堀江貴文さんがライブドアの前の会社で事業をしていた頃は、オンプレミスのサーバーが主流で数十件のアクセスが集中しただけで簡単にサーバーが落ちてしまっていたそうです。当時のエンジニアのストレスが大きかったことは容易に想像できます。

でもいまは優秀なクラウドサーバーがあります。AWSで盤石な環境を構築していれば、よっぽどのことがない限りサーバーが落ちたりすることはありません。今回紹介したログローテーションのように設定は必要ですが。

AWSではCloud9というブラウザ上で開発できるサービスや、Amazon Machine Learningという機械学習のモデルを早く簡単に構築できるサービスなど、エンジニアにとって快適な環境がどんどん提供されていってます。

AWSの情報はいち早くキャッチアップしたいところです。