前提
Ruby on Rails(v5.2.5)でWebアプリケーションを開発・運用しています。
ログインの仕組みはdevise gemを利用し、
userモデル(団体会員)とpersonモデル(個人会員)をそれぞれログインユーザ方法を保持するモデルとして定義しています。
session情報の保存(session_store)にはRedis(ElastiCache for Redis)を使っています。
(Redisはキャッシュの保存やsidekiqのキューとしても利用しています)
実現したいこと
Railsログ(production.log
)にログイン中のユーザのIDも表示させたいです。
現在、以下のようにリクエストIDなどは表示している状態です。
ログイン中のユーザが存在する場合はここに追加したいです。
I, [2022-07-12T07:37:12.020791 #1] INFO -- : [i5ab0ff7-9a01-9995-hf9a-i51fduu107p0] Rendered articles/show.html.erb within layouts/application (4574.8ms)
config/environments/production.rb
の状態(抜粋)
config.logger.formatter = ::Logger::Formatter.new config.log_tags = [ :request_id ]
発生している問題・エラーメッセージ
ネット検索で見当たった以下の方法を試してみましたが、
それぞれ上手くいかない状態です、、
1. Rails.application.config.session_options
を使用(参考サイト)
⇛結果:何も出力されない
ruby
config.log_tags = [ :request_id, ->(req) { session_key = (Rails.application.config.session_options || {})[:key] session_data = req.cookie_jar.encrypted[session_key] || {} users = [] %w(user person).each do |scope| user_id = session_data.dig("warden.user.#{scope}.key", 0, 0) users << "#{scope}:#{user_id}" if user_id end users.join(',') } ]
pry-byebugで途中で止めてそれぞれの変数の中身を確認したところ、session_key
にはRedisのサーバ情報しか格納されておらず、 session_data
には何も格納されていなかったため、
ログイン中のユーザで操作を行っても、戻り値はnilになる状態でした。
2.セッションストアからセッション情報を抽出する方法(参考サイト)
⇛結果:何も出力されない
config.log_tags = [ :request_id, ->(req) { Redis.current = Redis.new(host: Settings.redis.host, port: "6379") Redis.current.keys('session:*').select {|key| user_hash = Marshal.load(Redis.current.get(key)) } } ]
※そもそも、 Redis.current.keys('session:*')
は大量に存在するため、どれが今のセッションか特定できない。
今のセッションがどれなのか特定する方法が不明
試したこと
「発生している問題・エラーメッセージ」に記載した通りとなります。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.6
Rails 5.2.5
お手数をお掛けしますが、何か「これっぽいのでは?」という情報だけでも示唆いただけると大変ありがたいです。
また、不足情報等ございましたら、恐れ入りますがご指摘いただけますと幸いです。
どうぞよろしくお願いいたします。
0 コメント