Добавить идентификатор пользователя ко всем сообщениям журнала в 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]
добавляется, когда любой пользователь вошел в систему, иначе ничего не будет добавлено.