“代理”捕获$ stderr和$ stdout for DB Storage

时间:2013-04-15 00:53:25

标签: ruby ruby-on-rails-3 mongoid delayed-job

我正在尝试将stderrstdout存储在我们的数据库中,以便我们后台进程的未来调试目的。我还希望捕获像代理一样透明,我的意思是我希望仍然将stderrstdout输出到常规记录器加上我们的数据库中。

我有这样的代码:

class Message

  include Mongoid::Document

  field :stdout
  field :stderr

  def enable_capture_output
    @previous_stderr, $stderr = $stderr, StringIO.new
    @previous_stdout, $stdout = $stdout, StringIO.new
  end

  def disable_and_save_captured_output
    self.stdout = $stdout.string
    self.stderr = $stderr.string
    $stderr = @previous_stderr
    $stdout = @previous_stdout
  end

end

但它效果不好。 :(

使用:Rails 3.2.11和带有DelayedJob的Mongoid 3.0.23

1 个答案:

答案 0 :(得分:0)

从您的评论中,您的问题似乎是您没有在数据库中看到结果流,因为它们正在发生。但是除了最后,您还没有将文档保存到数据库中。所以...如果你想在流程结束之前在数据库中看到结果,那么你必须在流程结束之前逐步写入数据库。

我建议您查看mongo的$push operator,您可以使用它来有效地向文档添加更多结果,而无需重写整个文档。您可以使用update命令将其用于moped,该命令是mongoid的基础。

或者,您可以使用logentriesloggly之类的日志聚合服务来节省大量工作。