How to log user_name in Rails?

后端 未结 12 1692
遇见更好的自我
遇见更好的自我 2020-12-15 06:52

I use Devise in Rails 3. I want to see name of current_user in production.log.

I would like to configure rails like this:

config.log_tags = [:user_na         


        
12条回答
  •  佛祖请我去吃肉
    2020-12-15 07:48

    Here is the cookie decrypter I use in Rails 5.1 to tag the logs with the user_id, which is stored in the cookie. It basically lets me access the controller equivalent of session[:user_id] from a raw cookie

    environments/production.rb:

    config.log_tags = [
      :request_id,
      :remote_ip,
      lambda do |req|
        session_data = CookieDecrypter.new(req).session_data
        "user_id:#{session_data['user_id']}"
      end
    ]
    

    app/models/cookie_decrypter.rb:

    class CookieDecrypter
      attr_reader :request
    
      def initialize(request)
        @request = request
      end
    
      def session_data
        cookie = request.cookies[session_key]
        return {} unless cookie.present?
        cookie = CGI::unescape(cookie)
        key_generator = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000)
        secret = key_generator.generate_key(salt)[0, ActiveSupport::MessageEncryptor.key_len]
        sign_secret = key_generator.generate_key(signed_salt)
        encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON)
        encryptor.decrypt_and_verify(cookie) || {}
      end
    
      private
    
      def session_key
        Rails.application.config.session_options[:key]
      end
    
      def secret_key_base
        Rails.application.secrets[:secret_key_base]
      end
    
      def salt
        Rails.application.config.action_dispatch.encrypted_cookie_salt
      end
    
      def signed_salt
        Rails.application.config.action_dispatch.encrypted_signed_cookie_salt
      end
    end
    

提交回复
热议问题