Rails 3 - протоколирование вывода всех запросов - PullRequest
4 голосов
/ 09 июня 2011

У меня есть приложение, которое выполняет множество вызовов API (xml и json).Мы хотим записать наш ответ на все запросы (мы отфильтруем наши html-ответы).

В общем, мы получаем вызовы в REST и возвращаем JSON или XML.Я записываю их сегодня с помощью round_filter в контроллере приложения, чтобы разрешить мне:

class ApplicationController < ActionController::Base
  around_filter :global_request_logging
  def global_request_logging
    # log request
    begin 
      yield
    ensure 
      #log response
    end 
  end 

  rescue_from Exception do |exception| 
    respond_to do |format| 
      format.xml {head 400}  
      # etc for JSON and HTML
    end 
  end 
end 

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я записываю ответ, мы еще не достигли блока rescue_from, поэтому мы регистрируем, что возвращаем 200.

Это наводит меня на мысль, что есть лучший способ / место для регистрации запроса / ответа в Rails.В идеале, я ищу способ регистрации проводов - такой же сырой, как входные и выходные данные клиента.

1 Ответ

3 голосов
/ 01 сентября 2011

Вы можете использовать промежуточное программное обеспечение Rack, например:

module Rack
  class Snoop
    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, body = @app.call(env)

      case status
      when 200
        # Who needs weekly status reports?
        mail(:to => "myteamleader@mycompany.com", :subject => "See, I told you the application works!", :body => body)
      when 500
        # A bit of extra motivation to fix these errors
        mail(:to => "ceo@mycompany.com", :subject => "Look boss, the application is broken again!", :body => body)
      end

      [status, headers, body]
    end
  end
end

Вы можете использовать его, вставив его в config/application.rb или в один из config/environments/ENV.rb.

config.middleware.insert_before(ActionDispatch::ShowExceptions, Rack::Snoop)

Вы заметите, что я вставил его до ActionDispatch::ShowExceptions, потому что это позволит отлавливать 500 ошибок, вызванных внутренними исключениями. Если вы хотите его в другом месте, вы можете посмотреть на стек промежуточного программного обеспечения с помощью rake middleware и поместить его в нужное место с помощью insert_before или insert_after.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...