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

与标题相同:如何在运行rspec时将Rails.logger打印到控制台/ stdout? 例如。

 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

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

对于Rails 3.x,在config/environments/test.rbconfiguration一个logging器:

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

这会将testing期间logging的任何错误交错到STDOUT。 您可能希望将输出路由到STDERR或使用其他日志级别。

将这些消息发送到控制台和日志文件需要比Ruby内置的Logger类更强大的function。 日志logginggem将做你想要的。 将它添加到你的Gemfile ,然后在config/environments/test.rb设置两个appender:

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

对于Rails 4.x,日志级别configuration与Rails 3.x有点不同

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

 # Enable stdout logger config.logger = Logger.new(STDOUT) # Set log level config.log_level = :ERROR 

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

环境variables

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

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

然后从shell运行testing:

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

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

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

我喜欢的解决scheme,因为它使rspec输出与实际的rails日志输出分离,所以需要执行以下操作:

  • 打开另一个terminal窗口或选项卡,并安排它,以便您可以看到您正在运行的主terminal以及新的terminal。
  • 在第二个窗口中运行一个tail命令,让你看到railslogin到testing环境中。 默认情况下,对于Window用户,这可以像$ tail -f $RAILS_APP_DIR/logs/test.logtail -f $RAILS_APP_DIR\logs\test.log
  • 运行你的rspec套件

如果你正在运行一个像iTerm这样的多窗格terminal,那么这会变得更有趣,并且你可以并排输出rspectest.log

您可以在spec_helper.rb中定义一个方法,将消息发送到Rails.logger.info,并将其用于debugging:

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