2011-06-09 58 views
4

我有一個應用程序,它執行大量的API調用(xml和json)。我們希望記錄我們對所有請求的響應(我們將過濾我們的html響應)。Rails 3 - 所有請求的日誌記錄輸出

通常,我們在REST中調用並返回JSON或XML。我記錄這些今天在應用程序控制器的around_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中記錄請求/響應。理想情況下,我正在尋找一種登錄線路的方式 - 就像客戶端的輸入和輸出一樣原始。

回答

3

你可以使用一個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 => "[email protected]", :subject => "See, I told you the application works!", :body => body) 
     when 500 
     # A bit of extra motivation to fix these errors 
     mail(:to => "[email protected]", :subject => "Look boss, the application is broken again!", :body => body) 
     end 

     [status, headers, body] 
    end 
    end 
end 

您可以通過將這種在使用它你config/application.rbconfig/environments/ENV.rb之一。

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

你會發現,我ActionDispatch::ShowExceptions之前插入它,那是因爲它會允許趕上造成內部異常的500錯誤。如果你想在其他地方,你可以偷看中間件堆棧rake middleware,並把它放在你想要的地方insert_beforeinsert_after

+0

如何過濾這個特定的URL模式,就像我想記錄所有的url「/ api/v2」所做的請求/響應... – vs4vijay 2017-01-17 11:34:27

相關問題