90

同标题:运行 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

4

6 回答 6

88

对于 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_levelhttps ://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
于 2015-09-17T10:36:47.243 回答
75

对于 Rails 4,请参阅此答案。

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

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

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

将这些消息发送到控制台和日志文件需要比 Ruby 内置的Logger类更强大的东西。日志记录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
于 2014-01-31T21:59:52.570 回答
35

将日志作为后台作业(&) 尾随,它将与 rspec 输出交错。

tail -f log/test.log &
bundle exec rspec
于 2013-12-23T21:32:38.533 回答
21

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

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

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

于 2013-05-08T17:53:52.430 回答
8

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

def log_test(message)
    Rails.logger.info(message)
    puts message
end
于 2012-08-02T03:42:44.537 回答
1

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

更改config.action_dispatch.show_exceptionsfalse解决问题:

# config/environments/test.rb
config.action_dispatch.show_exceptions = false
于 2021-08-26T10:29:26.203 回答