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ですので、それをログに出力します。