运行 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.log
或 tail -f $RAILS_APP_DIR\logs\test.log
运行您的 rspec 套件
如果您正在运行像 iTerm 这样的多窗格终端,这会变得更加有趣,并且您可以并排输出 rspec
和 test.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 打印到控制台/标准输出?的主要内容,如果未能解决你的问题,请参考以下文章