デバッグ目的でユーザー アクションを追跡できるようにするために、セッションのログイン ユーザー ID をすべてのログ メッセージの先頭に追加することを検討しています (該当する場合)。私たちのスタックは、Rails と Authlogic で構成されています。いくつかの異なるルートを試しましたが、これまでのところ 100% 成功したものはありません。
Authlogic はセッション データにユーザー ID をプレーン テキストで保存しないため、初期化されるまで待機する必要があります。これは、ApplicationController が初期化され、アクティブな Authlogic コントローラーに設定された後にのみ発生します。このため、コードに依存することはできませんconfig/application.rb
。唯一の解決策は、後でロガーを交換することです。
add()
Logger をサブクラス化し、メソッドを上書きして、新しいロガー クラスを作成しようとしました。
class UserLogger < Logger
def add(severity, message = nil, progname = nil, &block)
begin
session = UserSession.find
rescue
return super(severity, message, progname, &block)
end
user = session.user if session
if block_given? || !user
return super(severity, message, progname, &block)
end
unless message.nil?
message = "[#{user.id}] " + message
end
super severity, message, progname, &block
end
end
これは、ログの前哨基地には何の影響もないようです。また、TaggedLogging をいじってみましたが、ブロック内のタグ付きコードをスローする必要があるため、これは良い解決策ではないようです。
また、Proc を指定してアプリケーション構成で定義しようとconfig.log_tags
しましたが、Authlogic は同じAuthlogic::Session::Activation::NotActivatedError
例外をスローしました。この例外をキャッチしようとすると、Ruby がどこかで無限ループのように見える非常に奇妙な状態になり、CPU が 100% に固定されました。
これまたは私が完全に見逃している簡単な解決策はありますか?