行動すれば次の現実

テック中心の個人ブログ

RailsのLogにuser idを出力する方法

Ruby on Rails5でリクエストログにユーザーIDを追加する方法を説明します。 ミドルウェアの修正は不要ですので、気軽に取り入れることができると思います。

実装内容

config/initializers/logging.rb

Rails.configuration.log_tags = [
  :request_id,
  lambda do |req|
    session_key = (Rails.application.config.session_options || {})[:key]
    session_data = req.cookie_jar.encrypted[session_key] || {}
    user_key = session_data['warden.user.user.key']
    user_id = user_key.present? ? user_key[0][0] : 'guest'
    "user: #{user_id}"
  end,
]

実装解説

config.log_tagsというメソッドを使用して出力したいタグを指定します。

https://railsguides.jp/configuring.html#config-log-tags

Rails5の場合、デフォルトでproduction.rbにconfig.log_tags = [ :request_id ] が指定されていますが、今回は環境問わずlogging.rbの内容で上書きします。

user_idを出力したいので、:request_idの後ろにrequestオブジェクトを引数に取るlambdaメソッドを定義します。

Rails.application.config.session_optionsからsession_key取得して、requestのcookie情報からsession_keyに対応するsession_dataを取得します。

session_dataは以下のような内容になっています。

{
  "session_id" => "c8aead6bfbdfsdfc2dsafasccdda2", 
  "warden.user.user.key" => [
    [12],
    "$2A$1d$Qd775IfaSsdfRfasdfdfmu"
  ],
  "_csrf_token" => "vffdcdfasd-t3rWY8mfDFADSFACEFDAfeccdsfffSA"
}

warden.user.user.keyの[0][0]がuser_idですので、それをログに出力します。