运行rspec时如何将Rails.logger打印到控制台/ stdout?


78

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

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

我还是希望Rails.loggerlog/test.log了。

Answers:


70

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

对于Rails 3.x,在config/environments/test.rb以下位置配置记录器:

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

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

将这些消息发送到控制台和日志文件都需要比Ruby内置的Logger类更强大的功能。该记录的宝石会做你想要什么。将其添加到中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

对于轨道4.2.1,我必须设置在配置日志级别,因为它被覆盖在bootstrap.rb该记录器实例:github.com/rails/rails/blob/v4.2.4/railties/lib/rails/...的日志级别设置如下:config.log_level = :ERROR
Thomas B Homburg

@tommes可以使用您添加的确切文件名和代码发布另一个答案吗?我将修改答案以指定它适用于Rails3.x。
Phil Calvin

1
如果只需要特定测试类的记录器输出,则可以放入config.logger = Logger.new(STDOUT)您的setup方法。如果只需要特定测试的记录器输出,则config.logger = Logger.new(STDOUT)在测试开始时输入。这至少适用于Rails 5.0.1上的MiniTest。
Lencho Reyes

我认为应该使用ActiveSupport::Logger而不是仅仅使用Logger。我刚中断生产,是因为我希望Rails.logger成为该ActiveSupport::Logger接口的对象,并且在开发和测试中它们是...
kaikuchn

仔细观察一下Rails.logger,结果发现它实际上是ActiveSupport::Logger包裹着ActiveSupport::TaggedLogging.new..
kaikuchn

74

对于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日志记录框架中没有内置的机制吗?
Pysis

我还发现了这个宝藏github.com/dominicsayers/loglevel它看起来像将创建另一个记录器,因此不确定是否可以将其集成在一起。
Pysis


21

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

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

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


7

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

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

1
我希望在调用Rails.logger.info之外获得一些东西,因为我在生产代码中使用了Rails.logger.info,Rails.logger.debug等。感谢您的回答。
s12chung 2012年

我懂了。但是,为什么这会阻止您在测试中使用Rails.logger?
manglewood

我也在测试中使用它。最好将所有内容打印到标准输出,而不是使用tail。
s12chung 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.