Rails 3 - 所有请求的日志记录输出

问题描述:

我有一个应用程序,它执行大量的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中记录请求/响应。理想情况下,我正在寻找一种登录线路的方式 - 就像客户端的输入和输出一样原始。

你可以使用一个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