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

时间:2011-05-10 08:50:23

标签: 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

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

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

class << Rails.logger
  def flush_error( message )
    Rails.logger.error message
    Rails.logger.flush
  end
end

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

4 个答案:

答案 0 :(得分:4)

如果由于某种原因,rails没有运行at_exit挂钩(飞行的猴子潜逃你的理智),而你真的真的想要那些日志条目,就像有些人说的那样并在重要的日志记录语句后运行:

Rails.logger.flush

logger.flush

瞧。

答案 1 :(得分:3)

你不能把它设置为“1”并且它会在每条消息后刷新吗?

config.logger.auto_flushing = 1

[编辑:正如madlep在上面的评论中指出的那样 - 这将是一个总资源浪费,并且可能不是一般的最佳登录方式。但如果你正在寻找狩猎 - 它是一种找到它的方法。那并将您的日志切换到“调试级别”]

您也可以使用以下方式将其关闭:

config.logger.auto_flushing = false

但这只是意味着你必须手动冲洗......

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

Rails.logger.flush

答案 2 :(得分:2)

尝试类似

的内容
Signal.trap("EXIT") { Rails.logger.flush }

当您初始化日志记录以向进程注册信号处理程序时。当它死亡时,它将在终止

之前执行块中的任何内容

有关详细信息,请参阅the docs

(注意 - 带有rails logger的完全未经测试的代码,但在进程终止时只是做某事的一般情况下工作。

答案 3 :(得分:1)

从Rails 3.1开始,这不再是必需的:Railties application / bootstrap.rb中的代码现在包含在at_exit中以刷新日志。

享受。