获取流式响应的日志中的准确时间?

时间:2013-10-09 23:51:42

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

使用Rails 3.2.14。我正在流式传输控制器动作响应,如下所示。

def my_controller_action
    stream = StreamingClass.new(*args) #responds to each
    response.sending_file= true
    headers.merge!(
      'Content-Disposition'       => 'inline',
      'Content-Transfer-Encoding' => 'binary',
      'Cache-Control'             => 'no-cache'
       )
       self.status = 200
    self.content_type= 'application/json'
    self.response_body = stream
end

流式传输工作正常,但问题是控制器操作在流式传输完成之前(即在每次在'stream'对象上调用之前)返回。它基本上在将'stream'对象分配给self.response_body后立即返回。

我正在使用lograge gem来整理我们的日志记录。 Lograge基本上订阅了'process_action.action_controller'通知。它根据实际控制器返回时间记录时间(即duration,db_runtime等等),而不跟踪在流对象代码上花费的任何时间。

繁重的提升发生在StreamingClass方法中,但我完全错过了日志中的这些信息。有没有办法在日志中包含流式响应时间?

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题。在我看来,判断流式传输完成的唯一方法是将response_body包装在一个代理对象中,其close方法包含记录所需统计信息的其他逻辑。你可以使用这样的东西:

class BodyProxy
  def initialize(body)
    @body = body
  end

  def each(&block)
    @body.each(&block)
  end

  def close
    @body.close if @body.respond_to?(:close)
    # Your code here. Probably something involving `Time.now`
  end
end

这是有效的,因为Rack specification要求在迭代后在主体上调用close

我对Lograge不熟悉,所以我不知道你会如何将这些信息发送给那个宝石,但这应该足以让你开始。