にゃんぱすー
ロードバランサのヘルスチェックで 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/
おしまい。