Help us understand the problem. What is going on with this article?

特定の条件でRailsのログ出力を抑止する

More than 5 years have passed since last update.

にゃんぱすー

ロードバランサのヘルスチェックで log/production.log が埋め尽くされるのが辛いので、特定の条件でログ出力を抑止する方法を調べたよ。

ロガークラスを作成する

まず、Rails::Rack::Loggerを継承したCustomLoggerを作成する。

lib/custom_logger.rb
class CustomLogger < Rails::Rack::Logger
  def call(env)
    if env["REMOTE_ADDR"] =~ Moe::Application.config.action_dispatch.trusted_proxies and !env["HTTP_X_FORWARDED_FOR"]
      Rails.logger.silence do
        super
      end
    else
      super
    end
  end
end

ここでは、ロードバランサのIPアドレスはtrusted_proxiesにマッチすること、通常のクライアントからのアクセスはヘッダにX-Fowarded-Forが付いていることを前提として、ヘルスチェックの場合のみRails.logger.silenceを呼び出してログ出力を抑止している。(クライアントのIPアドレスに置き換わるrequest.remote_ip的な情報が取れれば良いのだが、見つからなかった。)

ロガークラスの入れ替え

config/initializers に適当なファイルを置く。

config/initializers/custom_logger.rb
require "custom_logger"
Moe::Application.config.middleware.swap Rails::Rack::Logger, CustomLogger

テスト

wgetとかtelnetで。

# ログが記録される
wget -O /dev/null --header="X-Forwarded-For: 192.0.2.100" http://www.example.com/

# ログが記録されない
wget -O /dev/null http://www.example.com/

おしまい。

yasu
Ruby & Rails 初心者です。
http://yasu.asuka.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away