【问题标题】:Rails + Heroku + RSpec : How to control loggingRails + Heroku + RSpec:如何控制日志记录
【发布时间】:2014-07-23 13:15:22
【问题描述】:

我有一个在 Heroku 上运行的 Ruby on Rails 3.2 应用程序。我正在为我的测试套件使用 RSpec。

刚开始的时候,我只是用了

之类的语句
p "Order completed at #{Time.now.to_s}"

生成日志。我这样做是因为 Heroku 使用其神奇的 jiggery-pokery 将所有日志转移到 STDOUT。

但是,我的测试套件现在将各种日志打印到 STDOUT,非常分散注意力。我希望在将应用程序部署到 Heroku 时出现这些日志,但我不想在我的 STDOUT 输出中看到它们以及我的 RSpec 输出。

有没有办法将 STDOUT 转移到诸如 log/test.log 之类的文件中,或者使用日志 API 来执行我想要的操作?

【问题讨论】:

  • 正确的记录方式是使用Rails.logger,而不是p。您还可以创建一个自定义记录器,该记录器可以随心所欲地写入,默认为 STDOUT。

标签: ruby ruby-on-rails-3 logging heroku rspec


【解决方案1】:

我不太熟悉 Heroku 实现的特殊性,但您应该能够毫无问题地选择自己的文件进行日志记录。如果他们无法记录到文件,我会感到非常惊讶。您可以在 environment.rb 中为 prod(即 Heroku)和 dev 定义不同的记录器,在适当的条件下使用类似以下内容:

Rails.logger = Logger.new(STDOUT)
Rails.logger = Log4r::Logger.new("Application Log")

或者在你的初始化器中像这样:

config.logger = Logger.new(STDOUT)
config.logger = Log4r::Logger.new("Application Log")

请注意,您的记录器有很多选项,例如,您可以使用 Log4r 代替内置记录器。

查看RoR Debugging Guide了解更多信息

【讨论】:

  • 那么您会感到非常惊讶。因为 Heroku 提供了分布式和可扩展的服务器架构,他们认为如果不提供可信赖的文件系统,这样做会更容易。您可以读取和写入文件,但如果删除 heroku 容器,该文件将消失。而且您无法保证应用程序中的所有容器都可以平等地访问文件,主要是因为它们可能位于不同的机器上。
【解决方案2】:

确保只在生产组中包含 gem 以避免此问题。

group :production do
  gem 'rails_12factor'
end

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 2013-06-16
    • 2016-11-28
    • 2010-11-16
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多