为什么我们在rails logger中使用块而不是字符串?

时间:2015-05-09 19:47:42

标签: ruby debugging ruby-on-rails-4

在Rails中,

当我们使用Logger类时,我们总是用块来定义而不是String -

Rails.logger.error { error.message }

不是以下方式 -

Rails.logger.error "error.message"

背后的原因是什么?

1 个答案:

答案 0 :(得分:11)

请查看此处的文档:

Impact of Logs on Performance

  

另一个潜在的缺陷是,如果您有多次调用Logger   在你的代码中像这样:

logger.debug "Person attributes hash: #{@person.attributes.inspect}"
  

在上面的示例中,即使是,也会对性能产生影响   允许的输出级别不包括调试。原因是Ruby   必须评估这些字符串,包括实例化   有点重的String对象并插入变量,和   这需要时间。因此,建议将块传递给   记录器方法,因为仅在输出级别为时才评估这些方法   相同或包含在允许的级别(即延迟加载)。

因此,您可以使用任一方法 - 传入string或传入block。该块是一种优化,它将推迟插入字符串(以及示例中的任何属性信息),直到Rails知道它将根据您的日志详细程度设置实际记录信息。