运行 rspec 时如何让 Rails.logger 打印到控制台/标准输出?

Posted

技术标签:

【中文标题】运行 rspec 时如何让 Rails.logger 打印到控制台/标准输出?【英文标题】:How to get Rails.logger printing to the console/stdout when running rspec? 【发布时间】:2012-07-31 00:23:43 【问题描述】:

同标题:运行 rspec 时如何让Rails.logger 打印到控制台/标准输出?例如。

Rails.logger.info "I WANT this to go to console/stdout when rspec is running"
puts "Like how the puts function works"

我还是想让Rails.logger 也去log/test.log

【问题讨论】:

【参考方案1】:

对于 Rails 4.x,日志级别的配置与 Rails 3.x 略有不同

将此添加到config/environment/test.rb

# Enable stdout logger
config.logger = Logger.new(STDOUT)

# Set log level
config.log_level = :ERROR

记录器级别从config.log_level 在记录器实例上设置:https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

环境变量

作为奖励,您可以允许使用具有默认值的环境变量覆盖日志级别,如下所示:

# default :ERROR
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")

然后从 shell 运行测试:

# Log level :INFO (the value is uppercased in bootstrap.rb)
$ LOG_LEVEL=info rake test

# Log level :ERROR
$ rake test

【讨论】:

我一直在寻找从环境中快速配置关卡的方法。我看到它可以手动完成,但我认为 Rails 日志框架中没有内置机制可以这样做? 我还发现了这个 gem:github.com/dominicsayers/loglevel 它看起来会创建另一个记录器,所以不确定它是否会干净地集成。【参考方案2】:

对于 Rails 4,请参阅 this answer.

对于 Rails 3.x,在 config/environments/test.rb 中配置一个记录器:

config.logger = Logger.new(STDOUT)
config.logger.level = Logger::ERROR

这会将测试期间记录的所有错误交错到 STDOUT。您可能希望将输出路由到 STDERR 或使用不同的日志级别。

将这些消息发送到控制台和日志文件需要比 Ruby 内置的 Logger 类更强大的东西。 logging gem 会做你想做的事。将其添加到您的Gemfile,然后在config/environments/test.rb 中设置两个附加程序:

logger = Logging.logger['test']
logger.add_appenders(
    Logging.appenders.stdout,
    Logging.appenders.file('example.log')
)
logger.level = :info
config.logger = logger

【讨论】:

对于 rails 4.2.1,我必须在配置中设置日志级别,因为它在记录器实例上的 bootstrap.rb 中被覆盖:github.com/rails/rails/blob/v4.2.4/railties/lib/rails/… 日志级别设置如下: config.log_level = :ERROR @tommes 你能用你添加的确切文件名和代码发布另一个答案吗?我将修改我的答案以指定它适用于 Rails 3.x。 如果您只需要特定测试类的记录器输出,您可以将config.logger = Logger.new(STDOUT) 放入您的setup 方法中。如果您只需要特定测试的记录器输出,请将config.logger = Logger.new(STDOUT) 放在测试的开头。这至少适用于 MiniTest on Rails 5.0.1。 我认为应该使用ActiveSupport::Logger 而不仅仅是Logger。我刚刚中断了生产,因为我希望 Rails.logger 成为具有 ActiveSupport::Logger 接口的对象,并且在开发和测试中它们是...... 仔细观察Rails.logger,原来它实际上是一个ActiveSupport::Logger 包裹着ActiveSupport::TaggedLogging.new..【参考方案3】:

将日志添加为background job (&),它将与 rspec 输出交错。

tail -f log/test.log &
bundle exec rspec

【讨论】:

这是一个巧妙的解决方案。【参考方案4】:

我喜欢的一个解决方案是执行以下操作,因为它将 rspec 输出与实际的 rails 日志输出分开:

打开第二个终端窗口或选项卡,并对其进行排列,以便您可以看到正在运行 rspec 的主终端以及新终端。 在第二个窗口中运行 tail 命令,以便在测试环境中看到 rails 日志。默认情况下,对于 Window 用户,这可能类似于 $ tail -f $RAILS_APP_DIR/logs/test.logtail -f $RAILS_APP_DIR\logs\test.log 运行您的 rspec 套件

如果您正在运行像 iTerm 这样的多窗格终端,这会变得更加有趣,并且您可以并排输出 rspectest.log

【讨论】:

【参考方案5】:

您可以在 spec_helper.rb 中定义一个向 Rails.logger.info 和 puts 发送消息并将其用于调试的方法:

def log_test(message)
    Rails.logger.info(message)
    puts message
end

【讨论】:

我希望调用 Rails.logger.info 之外的东西,因为我在生产代码中使用 Rails.logger.info、Rails.logger.debug 等。谢谢你的回答。 我明白了。但是为什么这会阻止你在测试中使用 Rails.logger? 我也在测试中使用它。将所有内容都打印到标准输出,而不是使用 tail。【参考方案6】:

我在 rails 5.0 中遇到过类似的问题。我的 api/request 规范没有将错误输出到控制台,而是输出到 log/test.log 文件中。其他测试类型正常输出错误到控制台。

config.action_dispatch.show_exceptions 更改为false 解决了这个问题:

# config/environments/test.rb
config.action_dispatch.show_exceptions = false

【讨论】:

以上是关于运行 rspec 时如何让 Rails.logger 打印到控制台/标准输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 rspec 中运行单个测试?

如何设置RSpec以最后测试功能,并且仅在所有其他测试通过时

显示每个 rspec 示例的运行时

如何从 Rspec 输出禁用 http 日志?

如何禁用Rspec输出的http日志?

尝试运行 rspec 时,我得到“未初始化的常量 ActiveModel”