Wie kann Rails.logger beim Ausführen von rspec auf die Konsole / stdout gedruckt werden?

79

Entspricht dem Titel: Wie wird Rails.loggerbeim Ausführen von rspec auf die Konsole / stdout gedruckt? 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.loggerzu gehen log/test.log.

s12chung
quelle

Antworten:

71

Für Schienen 4 siehe diese Antwort.

Konfigurieren Sie für Rails 3.x einen Logger in config/environments/test.rb:

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

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

Das Senden dieser Nachrichten sowohl an die Konsole als auch an eine Protokolldatei erfordert etwas Robusteres als die in Ruby integrierte Logger- Klasse. Das Protokollierungsjuwel macht, was Sie wollen. Fügen Sie es Ihrem hinzu Gemfileund richten Sie dann zwei Appender ein 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
Phil Calvin
quelle
Für Rails 4.2.1 musste ich die Protokollstufe in der Konfiguration festlegen, da sie in bootstrap.rbder Logger-Instanz überschrieben wurde : github.com/rails/rails/blob/v4.2.4/railties/lib/rails/… The Log Level wurde wie folgt eingestellt:config.log_level = :ERROR
Thomas B Homburg
@tommes Kannst du eine weitere Antwort mit dem genauen Dateinamen und Code, den du hinzugefügt hast, posten? Ich werde meine Antwort ändern, um anzugeben, dass sie für Rails 3.x gilt.
Phil Calvin
1
Wenn Sie nur die Logger-Ausgabe für eine bestimmte Testklasse benötigen, können Sie config.logger = Logger.new(STDOUT)Ihre setupMethode eingeben. Wenn Sie nur die Logger-Ausgabe für einen bestimmten Test benötigen, setzen Sie config.logger = Logger.new(STDOUT)am Anfang des Tests. Dies funktioniert zumindest für MiniTest on Rails 5.0.1.
Lencho Reyes
Ich denke man sollte ActiveSupport::Loggerstatt nur verwenden Logger. Ich habe gerade die Produktion abgebrochen, weil ich erwartet hatte Rails.logger, ein Objekt mit der ActiveSupport::LoggerSchnittstelle zu sein, und in dev & test sind sie ...
kaikuchn
Bei näherer Betrachtung Rails.loggerstellt sich heraus, dass es sich tatsächlich um eine ActiveSupport::LoggerActiveSupport::TaggedLogging.new
Verpackung handelt
75

Für Rails 4.x ist die Protokollstufe etwas anders konfiguriert als in Rails 3.x.

Fügen Sie dies hinzu config/environment/test.rb

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

# Set log level
config.log_level = :ERROR

Die Logger-Ebene wird in der Logger-Instanz unter config.log_levelfolgender Adresse festgelegt : https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

Umgebungsvariable

Als Bonus können Sie das Überschreiben der Protokollebene mithilfe einer Umgebungsvariablen mit einem Standardwert wie dem folgenden zulassen:

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

Und dann Tests von der Shell ausführen:

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

# Log level :ERROR
$ rake test
Thomas B. Homburg
quelle
Ich habe versucht, das Level schnell aus der Umgebung heraus zu konfigurieren. Ich sehe, dass dies manuell durchgeführt werden kann, aber ich nehme an, dass es im Rails-Protokollierungsframework keinen integrierten Mechanismus dafür gibt.
Pysis
Ich habe auch dieses Juwel gefunden: github.com/dominicsayers/loglevel Es liest sich so, als würde es einen weiteren Logger erstellen, also nicht sicher, ob sich das sauber integrieren lässt.
Pysis
32

Tail das Protokoll als Hintergrundjob (&) und es verschachtelt mit rspec Ausgabe.

tail -f log/test.log &
bundle exec rspec
Jared Beck
quelle
7
Dies ist eine saubere Lösung.
Gal
21

Eine Lösung, die mir gefällt, weil sie die rspec-Ausgabe von der tatsächlichen Schienenprotokollausgabe trennt, besteht darin, Folgendes zu tun:

  • Öffnen Sie ein zweites Terminalfenster oder eine zweite Registerkarte und ordnen Sie sie so an, 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 einen Befehl tail aus, damit das Rails-Protokoll in der Testumgebung angezeigt wird. Standardmäßig kann dies wie $ tail -f $RAILS_APP_DIR/logs/test.logoder tail -f $RAILS_APP_DIR\logs\test.logfür Windows-Benutzer sein
  • Führen Sie Ihre rspec-Suiten aus

Wenn Sie ein Multi-Pane-Terminal wie iTerm betreiben, macht dies noch mehr Spaß und Sie haben rspecund die test.logAusgabe nebeneinander.

Shyam Habarakada
quelle
7

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

def log_test(message)
    Rails.logger.info(message)
    puts message
end
Manglewood
quelle
1
Ich hatte auf etwas Äußeres gehofft, um Rails.logger.info aufzurufen, weil ich Rails.logger.info, Rails.logger.debug usw. in meinem Produktionscode verwende. Vielen Dank für die Antwort.
s12chung
Aha. Aber warum hindert Sie das daran, Rails.logger in Ihren Tests zu verwenden?
Manglewood
Ich benutze es auch in meinen Tests. Es wäre einfach schön, wenn alles auf Standard gedruckt würde, anstatt Schwanz zu verwenden.
s12chung