アルパカログ

カスタマーサポート (CS) とエンジニアリングを掛け算したい CRE (Customer Reliability Engineer) が気になる技術や思ったことなど。

【Ruby on Rails】Logrageでuser_idをログに記録する

Ruby on Rails 5 で API アプリケーションを使っていて、Lograge でリクエストログに user_id を追加するときちょっとハマったのでメモしておきます。

README では下記のように書かれています。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def append_info_to_payload(payload)
    super
    payload[:user_id] = current_user.try(:id)
  end
end

API アプリケーションとして使っていると ApplicationControllerActionController::Base ではなく ActionController::API を継承していると思います。

ですのでベースクラスを ActionController::API に変更してあげる必要があります。下記のようにします。

# config/initializers/lograge.rb
Rails.application.configure do
  config.lograge.base_controller_class = 'ActionController::API'
end

API と通常の Web View 両方使う場合は array で指定します。

# config/initializers/lograge.rb
Rails.application.configure do
  config.lograge.base_controller_class = ['ActionController::API', 'ActionController::Base']
end

ApplicationController#append_info_to_payload で追加した user_id をログに出力するには下記のように custom_options で指定します。

# config/environments/staging.rb
Rails.application.configure do
  config.lograge.enabled = true

  config.lograge.custom_options = lambda do |event|
    { user_id: event.payload[:user_id] }
  end
end

これで user_id がログに出力されます。payload に追加したものの custom_options に追加していなくて「なんで user_id が出ないんだろう?」とハマっていたのでした。

こちらもあわせて読みたい

alpacat.hatenablog.com