8

デバッグ目的でユーザー アクションを追跡できるようにするために、セッションのログイン ユーザー 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% に固定されました。

これまたは私が完全に見逃している簡単な解決策はありますか?

4

3 に答える 3

6

sessionオブジェクトからオブジェクトにアクセスすることはできませんrequest。でも、アクセスできますcookies

したがって、ユーザーのログイン後に次のコードを追加します。

cookies.signed[:user_id] = @user.id

そして、次のような初期化子を追加します。

MyApp::Application.config.log_tags = [
    -> request { "user-#{request.cookie_jar.signed[:user_id]}" }
]

これで、すべてのログに、[user-980191314]または[user-]先頭に追加されます。

于 2017-01-11T12:29:30.403 に答える
1

私のプロジェクトでもカスタム ロガーを使用しており、environments/production.rb に接続しています。production.rb で Rails ロガーを設定していますか?

config.logger = ActiveSupport::TaggedLogging.new(UserLogger.new)
于 2012-12-12T07:11:51.377 に答える