如何在运行rspec时将Rails.logger打印到console/stdout?

s12*_*ung 71 console logging rspec stdout ruby-on-rails

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

Rails.logger.info "I WANT this to go to console/stdout when rspec is running"
puts "Like how the puts function works"
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*urg 66

对于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
Run Code Online (Sandbox Code Playgroud)

记录器级别在以下位置的记录器实例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")
Run Code Online (Sandbox Code Playgroud)

然后从shell运行测试:

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

# Log level :ERROR
$ rake test
Run Code Online (Sandbox Code Playgroud)


Phi*_*vin 62

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

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

config.logger = Logger.new(STDOUT)
config.logger.level = Logger::ERROR
Run Code Online (Sandbox Code Playgroud)

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

将这些消息发送到控制台和日志文件需要比Ruby的内置Logger类更强大的功能.该记录的宝石会做你想要什么.将其添加到您的Gemfile,然后设置两个appender 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
Run Code Online (Sandbox Code Playgroud)


Jar*_*eck 29

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

tail -f log/test.log &
bundle exec rspec
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案. (6认同)

Shy*_*ada 21

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

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

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


小智 6

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

def log_test(message)
    Rails.logger.info(message)
    puts message
end
Run Code Online (Sandbox Code Playgroud)