99 Stimmen

Wie Rails.logger Druck auf der Konsole/stdout zu bekommen, wenn rspec ausgeführt wird?

Wie der Titel: Wie man die Rails.logger Druck auf die Konsole/stdout bei der Ausführung von rspec? Z. B.

Rails.logger.info "I WANT this to go to console/stdout when rspec is running"
puts "Like how the puts function works"

Ich möchte immer noch Rails.logger zu gehen, um log/test.log auch.

99voto

Thomas B Homburg Punkte 1881

Für Rails 4.x ist der Log-Level ein wenig anders konfiguriert als in Rails 3.x

Dies hinzufügen zu config/environment/test.rb

# Enable stdout logger
config.logger = Logger.new(STDOUT)

# Set log level
config.log_level = :ERROR

Der Logger-Level wird in der Logger-Instanz von config.log_level am: https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

Umgebungsvariable

Als Bonus können Sie das Überschreiben des Loglevels durch eine Umgebungsvariable mit einem Standardwert wie folgt erlauben:

# default :ERROR
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")

Und dann Tests von der Shell aus durchführen:

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

# Log level :ERROR
$ rake test

77voto

Phil Calvin Punkte 4987

Für Rails 4, siehe diese Antwort.

Für Rails 3.x, konfigurieren Sie einen Logger in config/environments/test.rb :

config.logger = Logger.new(STDOUT)
config.logger.level = Logger::ERROR

Dadurch werden alle Fehler, die während des Tests protokolliert werden, in STDOUT eingefügt. Möglicherweise möchten Sie die Ausgabe an STDERR weiterleiten oder stattdessen eine andere Protokollstufe verwenden.

Um diese Nachrichten sowohl an die Konsole als auch an eine Logdatei zu senden, ist etwas Robusteres als Rubys eingebautes Logger Klasse. Die Website Protokollierung gem wird tun, was Sie wollen. Fügen Sie es zu Ihrem Gemfile und richten Sie dann zwei Appender in 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

40voto

Jared Beck Punkte 15494

Verfolgen Sie das Protokoll als Hintergrundjob (&) und es wird mit der rspec-Ausgabe verschachtelt.

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

Wenn Sie mit dem Protokoll fertig sind, bringen Sie es wieder in den Vordergrund mit fg und beenden Sie die tailctrl - c wie immer.

21voto

Shyam Habarakada Punkte 14267

Eine Lösung, die mir gefällt, weil sie die rspec-Ausgabe von der tatsächlichen Rails-Log-Ausgabe trennt, ist die folgende Vorgehensweise:

  • Öffnen Sie ein zweites Terminalfenster oder eine Registerkarte, und richten Sie es so ein, dass Sie sowohl das Hauptterminal, auf dem Sie rspec ausführen, als auch das neue Terminal sehen können.
  • Führen Sie im zweiten Fenster den Befehl tail aus, damit Sie das Schienenprotokoll in der Testumgebung sehen. Standardmäßig kann dies wie folgt aussehen $ tail -f $RAILS_APP_DIR/logs/test.log o tail -f $RAILS_APP_DIR\logs\test.log für Windows-Benutzer
  • Führen Sie Ihre rspec-Suiten aus

Wenn Sie ein Terminal mit mehreren Fenstern wie iTerm verwenden, macht dies sogar noch mehr Spaß und Sie haben rspec und die test.log Leistung nebeneinander.

8voto

pmwood Punkte 729

Sie können eine Methode in spec_helper.rb definieren, die eine Nachricht sowohl an Rails.logger.info als auch an puts sendet und diese zum Debuggen verwendet:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X