質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

370閲覧

Railsログにログイン中のユーザIDを表示させたい

otdsh9432

総合スコア55

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2022/09/02 09:03

編集2022/09/07 01:59

前提

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

1 config.log_tags = [ 2 :request_id, 3 ->(req) { 4 session_key = (Rails.application.config.session_options || {})[:key] 5 session_data = req.cookie_jar.encrypted[session_key] || {} 6 users = [] 7 %w(user person).each do |scope| 8 user_id = session_data.dig("warden.user.#{scope}.key", 0, 0) 9 users << "#{scope}:#{user_id}" if user_id 10 end 11 users.join(',') 12 } 13 ]

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

お手数をお掛けしますが、何か「これっぽいのでは?」という情報だけでも示唆いただけると大変ありがたいです。
また、不足情報等ございましたら、恐れ入りますがご指摘いただけますと幸いです。
どうぞよろしくお願いいたします。

(なお、同内容の質問をもう一つさせていただいていますが、そちらは古いもので、その旨も記事へ記載しております。もし古い方にて回答や進展ありましたら、随時こちらへも反映させていただきます)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問