タイトルと同じ:rspecの実行中にRails.logger
印刷をconsole/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
に行きたいです。
Rails 4については、 この回答 を参照してください
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
に2つのアペンダーをセットアップします。
logger = Logging.logger['test']
logger.add_appenders(
Logging.appenders.stdout,
Logging.appenders.file('example.log')
)
logger.level = :info
config.logger = logger
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 #L7
環境変数
ボーナスとして、次のようなデフォルト値の環境変数を使用して、ログレベルの上書きを許可できます。
# default :ERROR
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")
そして、シェルからテストを実行します:
# Log level :INFO (the value is uppercased in bootstrap.rb)
$ LOG_LEVEL=info rake test
# Log level :ERROR
$ rake test
ログを バックグラウンドジョブ (&)としてテールすると、rspec出力とインターリーブします。
tail -f log/test.log &
bundle exec rspec
Rspecの出力を実際のRailsログ出力とは別に保持するため、私が気に入っている解決策は、次のようにすることです。
$ tail -f $Rails_APP_DIR/logs/test.log
またはtail -f $Rails_APP_DIR\logs\test.log
のようになりますITermのようなマルチペインターミナルを実行している場合、これはさらに楽しくなり、rspec
とtest.log
出力が並んでいます。
Rails.logger.infoにメッセージを送信し、それをデバッグに使用するために使用するメソッドをspec_helper.rbで定義できます。
def log_test(message)
Rails.logger.info(message)
puts message
end