トップイメージ

本番環境のためのログローテーションの設定をしてみました

こんにちは。 自分が(勉強するのが)楽しいのと、知識の定着のためにブログを続けている筆者です。

やはり、仕事で色々任せてもらえるのは嬉しいですが、辛いこと・キツイことも多々ありますね。そんな時に、自分のために自分がしたい勉強をすると、活力が湧いてきますね。自分がしたいってのがミソなんでしょうね。

さて、今回もプログラマー的な内容という訳ではないのですが、Railsのログローテーションを設定する機会がありましたので、備忘録としてまとめておきたいと思います。

ログローテーションって何?

OSやミドルウェア、Railsなんかでも、「いつ・誰から・どういうアクセス(要求)があって、どういう結果になった」というログを吐き出してくれています。それは放置しておくと、ひたすらにログ情報が書き込まれるので、ディスク容量を圧迫し、サービスに悪影響を及ぼしてしまいます。

そんな、状況にならないように、ログファイルを一定の期間や、特定の容量になったら、そのファイルではなく、別のファイルにログを吐き出してもらって、古くなったログファイルを削除して・・・

という風にローテーションをしていくことで、システム管理者側で想定した期間(はたまた容量)分のログを保持しながら、ディスク容量の圧迫が起きないようにするというものかと思っています。

Rails(on Centos7)ではどういう風に設定するのか?

Railsのロガー機能などが使えるようですが、今回はCentOs7では(結構)標準で利用できる、logrotateという機能を利用しました。

ちなみに、ロガー機能の例は下記の外部記事などをご参照ください。

Railsでログの設定+ローテートを行う(外部記事)

設定内容

今回は、アクセス数などを考慮して、以下の通り設定をしてみました。

  • 週次でログファイルを新しいファイルに書き込んでいくように設定
  • 4世代分ログを保持する(役1ヶ月で4個のログファイルを保持する)

設定するための操作は以下の通りです。

#logrotateがインストールされているか確認
yum list installed | grep logrotate
#インストールされていなかったらインストール
yum install logrotate

#/etc/logrotate.d/には各サービスやミドルウェアのログローテーションの設定情報が格納されているので、こちらに該当するrailsサービスの設定ファイルを用意する

touch /etc/logrotate.d/rails_service
vim /etc/logrotate.d/rails_service

設定ファイルには以下のように書き込みます。


#フォルダは本番用環境のフォルダを指定すること!
/各railsサービスまでのパス/log/production.log {
  weekly #週次
  rotate 4 #4世代分
  missingok #ログファイルがなくてもエラーにしない
  notifempty #ログファイルが空ならローテーションしない
  copytruncate #ログをコピーしたのち、古いファイルを削除する
  su root root #指定したユーザーとグループでログローテートを実行
}

###

このように設定して、実際にログローテーションが行われているか試すことができます。

logrotate -v /etc/logrotate.d/rails_service

無事実行されていると・・・

こんな感じでログローテーションが実行されます

このように週に一回のペースで、ログファイルを作成してくれて、古いログファイルを破棄していってくれます。

ちなみに、ログのローテーションの最終実行日時については、

/var/lib/logrotate/logrotate/logrotate.statusという所に記録されていますので、こちらをvimなどで編集することで、ログローテーションを試し直すこともできます。

まとめ

  • アクセスが多いサービスであればあるほど、ログは溜まっていく
    • 適切にローテーションを実行する必要がある