在Rails应用程序中记录线程

我有一个Rails应用程序,其中一小部分操作需要大量的计算时间。 我没有经历将这些操作作为后台任务的复杂性,而是发现我可以将处理分割成多个线程,并且通过使用带有多核服务器的JRuby,我可以确保所有线程在合理的时间内完成。 (客户已经表达了对保持这种方法与后台运行任务的强烈兴趣。)

问题在于写入Rails日志记录器在这些线程中不起作用。 在日志文件中什么都没有显示。 我发现这个问题的一些参考,但没有解决方案。 我不介意在我的代码中插入puts来帮助调试,但stdout似乎被glassfish gem应用服务器所吞噬。

有没有人成功地在Rails ruby​​线程内完成日志记录,而不是每次都创建一个新日志?


我用同样的问题挠了挠头。 对我来说,答案如下:

Thread.new do
  begin
    ...
  ensure
    Rails.logger.flush
  end
end

我理解你对后台任务的担忧,但请记住,在Rails中脱离线程可能是一件可怕的事情。 该框架几乎没有多线程的规定,这意味着您必须将所有Rails对象视为不是线程安全的。 即使数据库连接也变得棘手。

至于记录器:标准的Ruby记录器类应该是线程安全的。 但即使Rails使用它,你也无法控制Rails应用程序正在做什么。 例如,基准测试机制将通过切换级别来“记录”记录器。

我会避免使用轨道记录器。 如果您想使用这些线程,请在线程内创建一个记录该操作消息的新记录器。 如果您不想为每个线程创建新的日志,还可以尝试在运行时中为每个线程都可以访问的内容创建一个线程安全的日志记录对象。

在你的地方,我可能会再看看后台工作解决方案。 虽然DRb看起来像一场噩梦,但“bj”看起来不错而且容易; 尽管它需要一些工作才能使它与JRuby一起运行。 也可以选择使用JRuby的Java调度程序,请参阅http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

链接地址: http://www.djcxy.com/p/43487.html

上一篇: Logging inside threads in a Rails application

下一篇: CustomizableOutDir=true breaks MSTest.exe during Team Build