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

4

我有一个应用程序需要进行许多API调用(XML和JSON),我们希望记录所有请求的响应(我们将过滤HTML响应)。

一般情况下,我们使用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 中有更好的方式/位置来记录请求/响应。理想情况下,我正在寻找一种记录线路的方法 - 尽可能原始地记录来自客户端的输入和输出。

1个回答

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 => "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_beforeinsert_after将其放置在所需位置。


如何为特定的URL模式过滤此内容,例如我想记录所有来自URL“/api/v2”的请求/响应。 - vs4vijay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接