Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 进程终止时如何写入/刷新Rails日志_Ruby On Rails - Fatal编程技术网

Ruby on rails 进程终止时如何写入/刷新Rails日志

Ruby on rails 进程终止时如何写入/刷新Rails日志,ruby-on-rails,Ruby On Rails,Rails logger具有自动刷新方法。它会延迟写入日志,直到条目数与设置的条目数相同为止。自Rails 2以来,这种情况就一直存在,其目的是通过停止在负载下对磁盘的常量写入来加快速度 这在大多数情况下都很好,但是我们有一些短期运行的作业,这些作业不会停留足够长的时间来通过刷新-任何错误都会消失 是否有任何方法可以保证在进程终止时刷新日志 编辑 最后我做了这个(但它非常冗长) 这会强制输出消息,但随后会自动刷新 对于真正完整的解决方案,请将其放入初始值设定项中: class <<

Rails logger具有自动刷新方法。它会延迟写入日志,直到条目数与设置的条目数相同为止。自Rails 2以来,这种情况就一直存在,其目的是通过停止在负载下对磁盘的常量写入来加快速度

这在大多数情况下都很好,但是我们有一些短期运行的作业,这些作业不会停留足够长的时间来通过刷新-任何错误都会消失

是否有任何方法可以保证在进程终止时刷新日志

编辑

最后我做了这个(但它非常冗长)

这会强制输出消息,但随后会自动刷新

对于真正完整的解决方案,请将其放入初始值设定项中:

class << Rails.logger
  def flush_error( message )
    Rails.logger.error message
    Rails.logger.flush
  end
end
class您不能将其设置为“1”吗?它将在每条消息之后刷新

config.logger.auto_flushing = 1
[编辑:正如madlep在上面的评论中指出的那样-这将是一个占用全部资源的问题,一般来说可能不是最好的日志记录方式。但是如果你在寻找bug,这是一种找到它的方式。这将使你的日志切换到“调试级别”]

您还可以通过以下方式将其关闭:

config.logger.auto_flushing = false
但这只是意味着你必须手动冲洗

或者,您可以在每个脚本的末尾使用以下命令专门刷新日志:

Rails.logger.flush
试试像这样的东西

Signal.trap("EXIT") { Rails.logger.flush }
初始化日志记录以向进程注册信号处理程序时。当它死亡时,它将在终止之前执行块中的任何内容

有关更多信息,请参阅


(注意-rails logger的代码完全未经测试,但一般情况下,只在进程结束时执行某些操作。

从rails 3.1开始,这不再是必需的:Railties应用程序/bootstrap.rb中的代码现在包括at_出口以刷新日志


享受。

如果出于某种原因,rails没有在_出口运行
钩子(飞行猴子带着你的理智潜逃),而你真的想要那些日志条目,那么按照一些人说的做,并在重要的日志声明之后运行此命令:

Rails.logger.flush


瞧。

这没有帮助-因为我正试图保留默认行为,但确保它在进程终止时刷新。如果进程终止-那么就没有什么可以刷新日志了。因为它死了…这就是问题所在。所以唯一的替代方法是定期刷新,以便所有内容都达到进程崩溃了…已经进入了日志。你是对的-我一直在考虑Java中不可靠的finalize方法,但是unicorns/mongrels等。是的。不幸的是,大多数进程都是这样(与线程相反,我认为Java使用finalize的东西)。事实上,有一个“finalize”类似于“确保”-但如果进程突然终止,它将毫无帮助。它只是确保在块内引发异常时完成工作。我想将其恢复为0,但它不允许我:(对不起,我的意思是向上投票。我会小心在每次日志记录调用时导致刷新,这会降低性能(但如果您不记录整个日志,这在您的情况下可能没问题)此方法的要点是仅在需要时调用flush,因为您可能正在查找一个在流程终止之前未到达日志的生产问题(例如在resque taskOOC中),您是否确实遇到过此类问题?当它发生时,流程是否会抛出异常或完全以静默方式失败?失败无声-即使它确实抛出了一个异常,你也不会看到它,因为它不会被刷新。所有这些答案现在都是无效的。有人知道它在Ruby 2.0和Rails 4中是如何工作的吗?添加到代码中肯定很好-但这只会诱捕自愿退出…而不是在进程刚刚死亡时(例如由于SEGV或类似原因)。只需说“:”)
Rails.logger.flush
logger.flush