Rails - Umleiten der Konsolenausgabe in eine Datei


81

Wenn ich dies auf einer Bash-Konsole mache:

cd mydir
ls -l > mydir.txt

Der Operator> erfasst die Standardeingabe und leitet sie in eine Datei um. So erhalte ich die Liste der Dateien mydir.txtanstelle der Standardausgabe.

Gibt es eine Möglichkeit, etwas Ähnliches auf der Rails-Konsole zu tun?

Ich habe eine Ruby-Anweisung, die viele Ausdrucke erzeugt (~ 8.000 Zeilen), und ich möchte sie vollständig sehen können, aber die Konsole "merkt" sich nur die letzten 1024 Zeilen oder so. Also habe ich darüber nachgedacht, in eine Datei umzuleiten. Wenn jemand eine bessere Option kennt, bin ich ganz Ohr.

Antworten:


105

Sie können Override verwenden $stdout, um die Konsolenausgabe umzuleiten:

$stdout = File.new('console.out', 'w')

Möglicherweise müssen Sie dies auch einmal aufrufen:

$stdout.sync = true

Dadurch werden alle Ausgaben in die Datei umgeleitet. Wenn Sie die Ausgabe vorübergehend umleiten möchten, stellen Sie sicher, dass Sie den ursprünglichen Wert von speichern, $stdoutdamit Sie ihn wieder ändern können.


Danke dir! Genau das habe ich gesucht.
Kikito

2
Es hat bei mir nicht funktioniert, bis ich hinzugefügt habe $stdout.sync=true. Bearbeitet.
Peter DeWeese

2
$stdout.reopen("my.log", "w")scheint eine elegantere Lösung zu sein, zu sehen unter: stackoverflow.com/a/2480439/21217
dain

$stdout = File.new('console.out', 'w')dauert sehr lange. Ich benutze Windows. Ich bin mir nicht sicher, ob das der Grund ist!
dhrubo_moy

137

Eine schnelle einmalige Lösung:

irb:001> f = File.new('statements.xml', 'w')
irb:002> f << Account.find(1).statements.to_xml
irb:003> f.close

Erstellen Sie ein JSON-Fixture:

irb:004> f = File.new(Rails.root + 'spec/fixtures/qbo/amy_cust.json', 'w')
irb:005> f << JSON.pretty_generate((q.get :customer, 1).as_json)
irb:006> f.close

Es gab mir NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>oder undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
Magne

5
Wo wird die Datei statements.xmlim System gespeichert? Ich kann die Datei nicht finden.
Sujits

1
Dies ist die bessere Antwort, um zu zeigen, wie ein bestimmter Datensatzspeicherauszug gespeichert werden kann, anstatt jemandem zu sagen, dass er noch ein Juwel oder Plugin hinzufügen soll (SO müde von Softwareempfehlungen, wenn sie nicht benötigt werden) ODER alles in der Konsole in eine Datei zu kopieren. Abgestimmt.
bshea

@SujitS - Die Datei wird in dem Verzeichnis gespeichert, aus dem Sie sie ausgeführt haben rails console(höchstwahrscheinlich im Stammverzeichnis Ihrer App). (Zumindest war dies bei mir der Fall.)
user664833

13

Abgesehen von Vegers Antwort gibt es eine oder mehrere Möglichkeiten, die auch viele andere zusätzliche Optionen bieten.

Öffnen Sie einfach Ihr Rails-Projektverzeichnis und geben Sie den folgenden Befehl ein:

rails c | tee output.txt

Der Befehl tee bietet auch viele andere Optionen, die Sie überprüfen können:

man tee

1
Das hat bei mir nicht funktioniert. Ich habe versucht zu laufen rails server | tee file.txtund es gibt keine Ausgabe an STDOUT oder die Datei. Ich denke nur, dass der Server in diesem Fall nicht startet.
Kapad

Server druckt nach stderr Ich denke, es sollte Optionen im Befehl tee geben, um dies ebenfalls umzuleiten.
Kevin

Ja, mach so etwas rails console 2>&1 | tee file.txt. Keine Option im Tee, nur einfache Umleitung von stderr nach stdout, damit beide in Ihrer file.txt landen.
Labyrinth

Die Datei war voller Konsolenfarbcodes. Verwenden Sie ppdiese Option , um eine Ausgabe ohne Farbcodes zu erhalten.
Tim Abell

4

Wenn Sie den folgenden Code in Ihre Umgebungsdatei schreiben, sollte dies funktionieren.

if "irb" == $0
  config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))
end

Sie können die Protokolldatei auch mit drehen

config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'), number_of_files, file_roation_size_threshold)

Sie können nur aktive Datensatzvorgänge protokollieren

ActiveRecord::Base.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))

Auf diese Weise können Sie auch unterschiedliche Logger-Konfigurationen / -Dateien für unterschiedliche Umgebungen verwenden.


Dies ist hilfreich, aber die andere Antwort macht das, was ich wollte, auf einfachere Weise. Vielen Dank, dass Sie sich die Zeit genommen haben, trotzdem zu antworten.
Kikito

3

Mit Hirb können Sie festlegen, dass nur die Hirb-Ausgabe in einer Textdatei protokolliert wird. Auf diese Weise können Sie die Befehle, die Sie in das Konsolenfenster eingeben, weiterhin sehen, und nur die Modellausgabe wird in die Datei übernommen.

Aus der Hirb-Readme :

Obwohl Ansichten standardmäßig in STDOUT gedruckt werden, können sie leicht geändert werden, um überall zu schreiben:

# Setup views to write to file 'console.log'.
>> Hirb::View.render_method = lambda {|output| File.open("console.log", 'w') {|f| f.write(output) } }

# Doesn't write to file because Symbol doesn't have a view and thus defaults to irb's echo mode.
>> :blah
=> :blah

# Go back to printing Hirb views to STDOUT.
>> Hirb::View.reset_render_method

Danke dafür, genau das, wonach ich gesucht habe!
Sbonami

2

Verwenden Sie Hirb . Es werden automatisch alle Ausgaben in irb angezeigt, die länger als ein Bildschirm sind. Fügen Sie dies in eine Konsolensitzung ein, um diese Arbeit zu sehen:

>> require 'rubygems'
>> require 'hirb'
>> Hirb.enable

Weitere Informationen dazu finden Sie in diesem Beitrag .


Vielen Dank für Ihre Antwort, aber ich habe nicht nach Paginierung gesucht. Ich wollte alles auf einer einzigen Seite sehen.
Kikito

2

Versuchen Sie es mit dem scriptDienstprogramm, wenn Sie ein Unix-basiertes Betriebssystem verwenden.

script -c "rails runner -e development lib/scripts/my_script.rb" report.txt

Das hat mir geholfen, die sehr, sehr lange Ausgabe eines Rails-Runner-Skripts einfach in eine Datei zu erfassen.

Ich habe versucht, die Umleitung zu einer Datei zu verwenden, aber sie wurde erst am Ende des Skripts geschrieben.

Das hat mir nicht geholfen, da ich nur wenige interaktive Befehle in meinem Skript hatte.

Dann habe ich nur scriptdie rails runnerIn-Script-Sitzung verwendet und dann ausgeführt, aber sie hat nicht alles geschrieben. Dann fand ich dies script -c "runner command here" output_fileund es speicherte die gesamte Ausgabe wie gewünscht. Dies war auf Ubuntu 14.04 LTS

Verweise:

/ubuntu/290322/how-to-get-and-copy-a-too-long-output-completely-in-terminal#comment1668695_715798

Schreiben der Ruby-Konsolenausgabe in eine Textdatei

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.