[rails]ELBのヘルスチェックをアプリケーションログに残さないようにする


Ruby2.1.4, Rails4.1.7で確認。

ELB使用時にRails上にヘルスチェック用のアクションを作って、Railsアプリの状態チェックをするようにした場合、アプリケーションログにヘルスチェックのログが残ってしまいます。

ヘルスチェック用のアクションをつくることに関しては以前の記事を参照ください。

[rails]ELB使用時にヘルスチェック用のアクションを作成する

上記記事に沿ってアクションを作成した場合は、以下のように /health へのアクセスがアプリケーションログに記録されます。

# log/production.log

I, [2014-12-15T19:59:54.149846 #7459]  INFO -- : Started GET "/health" for 127.0.0.1 at 2014-12-15 19:59:54 +0900
I, [2014-12-15T19:59:54.298638 #7471]  INFO -- : Started GET "/health" for 127.0.0.1 at 2014-12-15 19:59:54 +0900

他のログを見ている最中にこのヘルスチェックログが何度も出てきてログが追い辛くなったので、ヘルスチェックのログのみ消せないか調べてやってみました。

  • CustomLoggerクラスを追加

lib以下にautoloadディレクトリを作成しcustom_logger.rbを追加します。

Rails.logger.silenceブロック内の処理はアプリケーションログに記録されないそうなので、 /health の場合はログに残さないようにしています。

# lib/autoload/custom_logger.rb

class CustomLogger < Rails::Rack::Logger
  def call(env)
    if ['/health'].include?(env['PATH_INFO'])
      Rails.logger.silence do
        super
      end
    else
      super
    end
  end
end
  • lib/autoload 以下をオートロードするように設定を書いておきます
# config/application.rb

config.autoload_paths += %W(#{config.root}/lib/autoload)
  • initializersにCustomLoggerの初期設定を追加
# config/initializers/custom_logger.rb

require "custom_logger"
Sample::Application.config.middleware.swap Rails::Rack::Logger, CustomLogger

これでELBからのアクセスのみアプリケーションログに残さないようにすることができました。

参考