当进程终止时如何写入/刷新 Rails 日志

Gho*_*oti 4 ruby-on-rails

Rails 记录器有 auto_flushing 方法。它会延迟写入日志,直到条目数与所设置的值相同。这自 Rails 2 以来就已经存在,旨在通过停止在负载下不断写入磁盘来加快速度。

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

有没有办法保证进程死掉时日志被刷新?

编辑

最后我这样做了(但是非常冗长)

af = Rails.logger.auto_flushing
Rails.logger.auto_flushing = true
Rails.logger.error "my message"
Rails.logger.auto_flushing = af
Run Code Online (Sandbox Code Playgroud)

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

对于真正完整的解决方案,请将其放入初始化程序中:

class << Rails.logger
  def flush_error( message )
    Rails.logger.error message
    Rails.logger.flush
  end
end
Run Code Online (Sandbox Code Playgroud)

然后只需使用该方法...

the*_*uth 5

如果由于某种原因,rails 没有运行钩子at_exit(飞猴带着你的理智潜逃),并且你真的非常想要这些日志条目,请按照一些人所说的那样,在重要的日志记录语句之后运行它:

Rails.logger.flush
Run Code Online (Sandbox Code Playgroud)

或者

logger.flush
Run Code Online (Sandbox Code Playgroud)

瞧。