1

使用 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

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

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

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

4

1 回答 1

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 规范要求close在“迭代后”在主体上调用它。

我不熟悉 Lograge,所以我不知道您将如何将此信息发送到该 gem,但这应该足以让您入门。

于 2014-06-02T20:44:56.113 回答