与标题相同: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.logger
去log/test.log
了。
Answers:
对于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
config.logger = Logger.new(STDOUT)
您的setup
方法。如果只需要特定测试的记录器输出,则config.logger = Logger.new(STDOUT)
在测试开始时输入。这至少适用于Rails 5.0.1上的MiniTest。
ActiveSupport::Logger
而不是仅仅使用Logger
。我刚中断生产,是因为我希望Rails.logger
成为该ActiveSupport::Logger
接口的对象,并且在开发和测试中它们是...
Rails.logger
,结果发现它实际上是ActiveSupport::Logger
包裹着ActiveSupport::TaggedLogging.new
..
对于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
我喜欢的一个解决方案是执行以下操作,因为它使rspec输出与实际的rails日志输出分开。
$ tail -f $RAILS_APP_DIR/logs/test.log
或tail -f $RAILS_APP_DIR\logs\test.log
如果您正在运行像iTerm这样的多窗格终端,这将变得更加有趣,并且您将rspec
与test.log
输出并排。
您可以在spec_helper.rb中定义一个方法,该方法将消息发送到Rails.logger.info以及将消息发送并用于调试:
def log_test(message)
Rails.logger.info(message)
puts message
end
bootstrap.rb
该记录器实例:github.com/rails/rails/blob/v4.2.4/railties/lib/rails/...的日志级别设置如下:config.log_level = :ERROR