web-dev-qa-db-ja.com

rspecを実行しているときにRails.loggerをconsole / stdoutに出力するにはどうすればよいですか?

タイトルと同じ: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.loggerlog/test.logに行きたいです。

69
s12chung

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
57
Phil Calvin

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
62

ログを バックグラウンドジョブ (&)としてテールすると、rspec出力とインターリーブします。

tail -f log/test.log &
bundle exec rspec
29
Jared Beck

Rspecの出力を実際のRailsログ出力とは別に保持するため、私が気に入っている解決策は、次のようにすることです。

  • 2つ目のターミナルウィンドウまたはタブを開き、rspecを実行しているメインターミナルと新しいターミナルの両方が見えるように配置します。
  • 2番目のウィンドウでtailコマンドを実行して、テスト環境でRailsログを確認します。デフォルトでは、これはWindowユーザーの$ tail -f $Rails_APP_DIR/logs/test.logまたはtail -f $Rails_APP_DIR\logs\test.logのようになります
  • Rspecスイートを実行する

ITermのようなマルチペインターミナルを実行している場合、これはさらに楽しくなり、rspectest.log出力が並んでいます。

21

Rails.logger.infoにメッセージを送信し、それをデバッグに使用するために使用するメソッドをspec_helper.rbで定義できます。

def log_test(message)
    Rails.logger.info(message)
    puts message
end
6
manglewood