Posted at

特定の条件で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/

おしまい。