Добавить идентификатор пользователя ко всем сообщениям журнала в Rails

Чтобы отследить действия пользователя в целях отладки, мы рассматриваем добавление идентификатора пользователя, вошедшего в сеанс, к каждому сообщению журнала (если применимо). Наш стек состоит из Rails и Authlogic. Я пробовал несколько разных маршрутов, но пока ни один из них не был на 100% успешным.

Поскольку Authlogic не хранит идентификатор пользователя в виде простого текста в данных сеанса, мы должны дождаться его инициализации. Это происходит только после инициализации ApplicationController и установки его в качестве активного контроллера Authlogic. Мы не можем полагаться на код в config/application.rb из-за этого. Мне кажется, единственное решение состоит в том, чтобы заменить регистратор на более позднее время.

Я попытался создать новый класс logger, создав подкласс Logger и переписав add() метод:

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, но это не кажется хорошим решением, так как вы должны бросить любой теговый код в блок.

Я также попытался определить config.log_tags в конфиге приложения, дав ему Proc, но Authlogic закинул тоже самое Authlogic::Session::Activation::NotActivatedError исключение. Попытка поймать это исключение привела Ruby в очень странное состояние, которое казалось где-то бесконечным циклом и привязало мой процессор к 100%.

Есть ли простое решение для этого или одно, которое я полностью отсутствует?

3 ответа

Невозможно получить доступ к 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-] предваряется.

Мой проект также использует собственный регистратор, и мы подключаем его в средах /production.rb. Вы устанавливаете регистратор Rails в production.rb?

config.logger = ActiveSupport::TaggedLogging.new(UserLogger.new)

Просто добавьте ответ Веданта. Иногда нам не нужно ничего печатать, если пользователь не вошел в систему. В этом случае:

config.log_tags = [Proc.new { |request| !request.cookie_jar.signed[:user_id].nil? ? "user_id: #{request.cookie_jar.signed[:user_id]}" : false } ]

Теперь в логах будет [user_id: XXXXXXXXX]добавляется, когда любой пользователь вошел в систему, иначе ничего не будет добавлено.

Другие вопросы по тегам