セッションの保存にactive_record_storeを選択した時、コンソール上のログに大量のセッション情報が毎回出力されて困った事がある人向けの情報です。
rails s で開発サーバーを立ち上げた時、コンソールに以下のセッションログが大量に表示されて邪魔ですよね。
# ↓ このログが何十行にもなる
UPDATE "sessions" SET "data" = $1, "updated_at" = $2 WHERE "sessions"."id" = $3 [["data", "BAh7EE ... 以下略
activerecord-session_storeのコードを見ると logger.silence_logger で囲まれているのでERRORレベル以上じゃないとログが出ないコードに見えます。
def write_session(request, sid, session_data, options)
logger.silence_logger do
ログのサイレンサーが有効になっていないのかな?と思ったのですが問題なく利用できる状態でした。
puts logger.silencer
true
development.logを見るとログのサイレンサーが有効になっているので、デフォルトのログ設定で標準出力でのみサイレンサーが有効にならないようです。
ちなみにログのサイレンサーはログレベルを一時的に入れ替えてログ出力を制御する仕組みです。
def silence(temporary_level = Logger::ERROR)
if silencer
begin
old_logger_level, self.level = level, temporary_level
yield self
ensure
self.level = old_logger_level
end
else
yield self
end
end
問題のログはsessionsテーブルに保存されるときに出力されるログです。
そのためピンポイントでログレベルを切り替える方が logger.silence_logger で解決するよりも簡単そうだったので以下のパッチを準備しました。
initializersの下に silence_active_record_store_log.rb と付けておいてください。
development環境でのみRails.logger.levelを一時的に入れ替えています。
module ActionDispatch
module Session
class ActiveRecordStore
if Rails.env.development?
alias :_set_session :set_session
def set_session(env, sid, session_data, options)
level = Rails.logger.level
Rails.logger.level = Logger::INFO
_set_session(env, sid, session_data, options)
ensure
Rails.logger.level = level
end
end
end
end
end
Rails5では set_session が write_session に置き換わるようです。
質問などあればコメント欄にお願いします。