2010-03-17 22 views
59

Auf einer Bash-Konsole, wenn ich dies tun:Schienen - Umleiten Konsole Ausgabe in eine Datei

cd mydir 
ls -l > mydir.txt 

Der Operator> fängt die Standardeingabe und leitet es in eine Datei; also bekomme ich die Auflistung der Dateien in mydir.txt anstatt in der Standardausgabe.

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

Ich habe eine Ruby-Anweisung, die viele Drucke erzeugt (~ 8k Zeilen) und ich würde es gerne vollständig sehen, aber die Konsole "erinnert" sich nur an die letzten 1024 Zeilen. Also habe ich darüber nachgedacht, auf eine Datei umzuleiten - Wenn jemand eine bessere Option kennt, bin ich ganz Ohr.

Antwort

77

können Sie überschreiben verwenden $stdout die Konsolenausgabe zu umleiten:

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

Sie müssen unter Umständen auch einmal diese nennen:

$stdout.sync = true 

Dies wird die gesamte Ausgabe in die Datei umleiten. Wenn Sie die Ausgabe vorübergehend umleiten möchten, stellen Sie sicher, dass Sie den ursprünglichen Wert von $stdout speichern, damit Sie ihn zurück ändern können.

+0

Thank you! Genau das habe ich gesucht. – kikito

+2

Es hat bei mir nicht funktioniert, bis ich hinzugefügt '$ stdout.sync = true'. Bearbeitet. –

+2

'$ stdout.reopen ("My.Log", "w")' scheint eine elegantere Lösung, gesehen bei: http://stackoverflow.com/a/2480439/21217 – dain

3

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

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

Sie können auch die Protokolldatei drehen mit

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

Nur aktive Datensatz bezogene Operationen Anmeldung können Sie

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

tun Dies können Sie auch verschiedene Logger config/Datei für verschiedene Umgebungen.

+0

Dies ist hilfreich, aber die andere Antwort tut, was ich auf einfachere Art und Weise wollte. Danke, dass du dir die Zeit genommen hast, trotzdem zu antworten. – kikito

2

Verwenden Sie hirb. Es blendet automatisch jede Ausgabe in irb ein, die länger als ein Bildschirm ist. Setzen Sie diese in einer Konsolensitzung, diese Arbeit zu sehen:

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

Für mehr auf, wie das funktioniert, read this post.

+0

Danke für die Antwort, aber ich suchte nicht nach Paginierung; Ich wollte alles auf einer einzigen Seite sehen. – kikito

101

Wenn Sie sich für eine schnelle einmalige Lösung, verwenden Sie einfach die folgende Suche:

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

erstellen JSON Befestigung

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

Genau das, was ich gesucht habe, danke schön! – kermitology

+0

Es gab mir 'NoMethodError: nicht definierte Methode 'Aussagen' für # ' oder 'nicht definierte Methode 'Aussagen' für # ' :( – Magne

+4

Wo die Datei 'statements.xml' ist erhalte im System gespeichert. ich die Datei nicht finden kann. – SujitS

3

Mit Hirb, können Sie nur die loggt Hirb Ausgabe in eine Textdatei. Dadurch können Sie immer noch die Befehle sehen, die Sie in das Konsolenfenster eingeben, und nur die Modellausgabe wird in die Datei übertragen.

Von dem Hirb readme:

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

# 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 
+0

Dank dafür, genau das, was ich gesucht habe! – sbonami

2

Neben Veger Antwort gibt eine von mehr Art und Weise zu tun, Es bietet auch viele andere zusätzliche Optionen.

Sie Ihre Schienen Projektverzeichnis öffnen und den Befehl eingeben:

rails c | tee output.txt 

-T-Befehl hat auch viele andere Optionen, die Sie überprüfen können:

man tee 
Verwandte Themen