Как мне добавить идентификатор сеанса к каждому сообщению журнала (Rails 3)? - PullRequest
5 голосов
/ 24 декабря 2011

Я хочу записать session_id и сохранить его в локальном хранилище потока, например,

Thread.current[:session_id] = session[:session_id]

Но некоторые журналы рельсов происходят до вызова моего фильтра.

Я думал, что смогу захватитьsession_id, написав плагин промежуточного программного обеспечения.Но опять же, мне кажется, я не получаю это достаточно рано для всех записей.

Какое самое раннее, что я могу захватить session_id?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 23 мая 2012

Поскольку Rails 3.2 поддерживает теговое ведение журнала с использованием массива конфигурации log_tags, массив log_tags принимает объект Proc, а объект proc вызывается с объектом запроса, я мог бы настроить log_tags следующим образом:

config.log_tags = [ :uuid, :remote_ip,
                    lambda {|req| "#{req.cookie_jar["_session_id"]}" } ]

Работает с Rails 3.2.3, используется хранилище сессий ActiveRecord.

2 голосов
/ 04 февраля 2012

Хорошо, я наконец понял это.

  1. Я переместился ActionDispatch::Cookies и ActionDispatch::Session::CookieStore намного раньше в стеке стойки. Это кажется безопасным и необходимо, потому что в противном случае ведение журнала происходит до инициализации сеанса.

  2. Я добавил свой собственный компонент промежуточного программного обеспечения для стойки, который устанавливает session_id в локальном хранилище потока.

  3. Я перезаписываю регистратор рельсов и добавляю session_id к каждому сообщению журнала.

Это очень полезно для возможности отделить и проанализировать все журналы для конкретного сеанса пользователя.

Мне было бы интересно узнать, как кто-то еще выполняет это.

1 голос
/ 05 ноября 2015

Основано на ответе @ Феликса. я сделал это в рельсах 4:

# config/application.rb
config.middleware.delete "ActionDispatch::Cookies"
config.middleware.delete "ActionDispatch::Session::CookieStore"
config.middleware.insert_before Rails::Rack::Logger, ActionDispatch::Cookies
config.middleware.insert_before Rails::Rack::Logger, ActionDispatch::Session::CookieStore

# config/environment/development.rb and production.rb
config.log_tags = [
  lambda {|req| "#{req.subdomain}/#{req.session["user_id"]}" },
  :uuid
]
config.log_formatter = Logger::Formatter.new

Это производит журналы как это:

I, [2015-11-05T15:45:42.617759 #22056]  INFO -- : [verimor/2] [77e593dc-c852-4102-a999-5c90ea0c9d66] Started GET "/home/dashboard" for 192.168.1.37 at 2015-11-05 15:45:42 +0200

[verimor/2] - это subdomain/user_id (это приложение для нескольких арендаторов).

[77e593dc-c852-4102-a999-5c90ea0c9d66] - уникальный идентификатор для этого запроса. Полезно для отслеживания жизненного цикла запросов.

НТН.

1 голос
/ 18 марта 2014

Для Rails 3.2 с ActiveSupport::TaggedLogging, если вы используете :cookie_store:

config.log_tags = [ :uuid, :remote_ip, 
                    lambda { |r| "#{r.cookie_jar.signed["_session_id"]["session_id"]}" } ]

Примечание. Измените значение "_session_id" на значение :key на config/initializers/session_store.rb

.

Похожие: https://stackoverflow.com/a/22487360/117382

...