Railsでログ出力を制御して、ログの量を削減する

はじめに

イタンジ株式会社の開発の三島です。現在、「物件管理くん」というサービスの開発を担当しています。
本記事ではRailsアプリケーションのログに出力する内容を制御し、ログの量を削減する方法についてまとめます。

背景

イタンジではAWSを使っており、CloudWatchでモニタリングをしています。
今回はログの内容を精査・制御して、ログの削減を行い、CloudWatchのコスト削減に取り組みます。

ログ削減したい項目

今回は以下の項目のログの制御に取り組みました。それぞれの方法について記載していきます。

  1. ActionViewからの情報のログ出力
  2. pdfや画像などのbase64にエンコードしたパラメータのログ出力
  3. SQLの実行ログ出力

ログ情報は以下のドキュメントを読むことで簡単に制御できます。

railsguides.jp

1. ActionViewからの情報のログ出力

View情報をログ出力しないようにするには、以下を初期化コードのいずれかに設定してあげると簡単に制御できます。 環境ごとに切り替えたいときは、該当する環境の設定ファイルに記載してください。

config.action_view.logger = nil

この一行によって、ActionViewのログを出力をしない設定で初期化されたアプリケーションが起動し、レンダリングのログなどを出力しないようにできます。

https://railsguides.jp/configuring.html#config-action-view-logger

2. pdfや画像などのbase64にエンコードしたパラメータのログ出力

物件管理くんにはpdfや画像を登録する機能があり、その際にファイルをbase64にエンコードしています。 base64に変換された値はそのままログ出力すると長い文字列で出力されるため、 pdfファイルと画像ファイルに該当するパラメータに対してフィルタを行うことで長いログ出力を回避できます。

フィルタも同様に初期化コードで制御可能で、パスワードなどの秘匿情報のフィルタに利用される config/initializers/filter_parameter_logging.rbにパラメータを追加することで対応できます。
ここでフィルタされた値はログでは、[FILTERED]という形で出力されます。

例:hogeというパラメータを部分一致でフィルタ、fugaというパラメータを完全一致でフィルタする。

Rails.application.config.filter_parameters += [:hoge] # 部分一致
Rails.application.config.filter_parameters += ['fuga'] # 完全一致

https://railsguides.jp/configuring.html#config-filter-parameters

3. SQLの実行ログ出力

SQLの実行ログを出力しないようにするには、初期化コードで以下を指定することで実現できます。

config.active_record.logger = nil

今回はSQLのログ出力を環境ごとにそれぞれ違う仕組みで切り替える設定を行いました。

  • 開発環境:railsのローカルでのキャッシュの制御を参考にtmp/以下にファイルが存在するかを確認して、ログ出力を切り替え
Rails.application.configure do
  # ...
  config.active_record.logger = nil if Rails.root.join('tmp/stop-sql-logging.txt').exist?
end
  • 本番環境:環境変数を設定し、環境変数の値に応じてログ出力を切り替え
Rails.application.configure do
  # ...
  logger                      = ActiveSupport::Logger.new($stdout)
  logger.formatter            = config.log_formatter
  config.logger               = ActiveSupport::TaggedLogging.new(logger)
  config.active_record.logger = ENV['SQL_LOGGING'] == 'true' ? logger : nil 
end

https://railsguides.jp/configuring.html#config-active-record-logger

終わりに

以上、Railsでログに出力する情報を制御して、ログを削減する方法についてまとめました。
今回の改善により、CloudWatchのログの量は変更前と比較して、約1/20の量まで削減することができました。

この記事をご覧の方の開発の一助になれば幸いです。それでは!