ruby-on-rails 如何在运行rspec时让Rails.logger打印到控制台/stdout?

vbkedwbf  于 2022-11-19  发布在  Ruby
关注(0)|答案(7)|浏览(113)

与标题相同:如何在运行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

flvlnr44

flvlnr441#

对于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
rxztt3cl

rxztt3cl2#

对于导轨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中设置两个appender:

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

vxqlmq5t3#

background job(&)结尾日志,它将与rspec输出交错。

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

当您处理完日志后,使用fg将其返回到前台,然后像往常一样使用ctrl-c退出tail

n3h0vuf2

n3h0vuf24#

我喜欢的一个解决方案是这样做的,因为它将rspec输出与实际的rails日志输出分开:

  • 打开第二个终端窗口或标签页,并对其进行排列,以便既可以看到正在运行rspec的主终端,也可以看到新终端。
  • 在第二个窗口中运行tail命令,以便在测试环境中看到rails日志。
  • 运行rspec套件

如果您运行的是多窗格终端(如iTerm),这将变得更加有趣,并且您可以同时获得rspectest.log输出。

83qze16e

83qze16e5#

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

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

apeeds0o6#

我在rails 5.0中也遇到过类似的问题。我的api/request规范没有将错误输出到控制台,而是输出到log/test.log文件中。其他测试类型正常地将错误输出到控制台。
config.action_dispatch.show_exceptions更改为false解决了此问题:

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

41zrol4v7#

除了现有的答案,如果您的要求是打印STDOUT中的日志以及日志文件,那么您可以使用日志广播。
我的一个用例是rake seed/tasks应该打印STDOUT的日志以及日志文件。

Rails.logger.extend(
  ActiveSupport::Logger.broadcast(
    ActiveSupport::Logger.new($stdout)
  )
)

相关问题