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

Ami*_*iya 8 ruby debugging ruby-on-rails-4

在Rails中,

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

Rails.logger.error { error.message }
Run Code Online (Sandbox Code Playgroud)

不是以下方式 -

Rails.logger.error "error.message"
Run Code Online (Sandbox Code Playgroud)

它背后的原因是什么?

Mar*_*cny 13

看一下这里的文档:

日志对性能的影响

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

logger.debug "Person attributes hash: #{@person.attributes.inspect}"
Run Code Online (Sandbox Code Playgroud)

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

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