rails - Przekierowanie wyjścia konsoli do pliku

81

Na konsoli bash, jeśli zrobię to:

cd mydir
ls -l > mydir.txt

Operator> przechwytuje standardowe wejście i przekierowuje je do pliku; więc otrzymuję listę plików mydir.txtzamiast w standardowym wyjściu.

Czy jest sposób na zrobienie czegoś podobnego na konsoli szynowej?

Mam instrukcję ruby, która generuje wiele wydruków (~ 8k linii) i chciałbym móc ją zobaczyć w całości, ale konsola „pamięta” tylko ostatnie 1024 linie. Pomyślałem więc o przekierowaniu do pliku - jeśli ktoś zna lepszą opcję, to mam uszy.

kikito
źródło

Odpowiedzi:

107

Możesz użyć override, $stdoutaby przekierować dane wyjściowe konsoli:

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

Być może trzeba będzie zadzwonić pod ten numer raz:

$stdout.sync = true

Spowoduje to przekierowanie wszystkich danych wyjściowych do pliku. Jeśli chcesz tymczasowo przekierować dane wyjściowe, upewnij się, że przechowujesz oryginalną wartość, $stdoutaby móc ją zmienić z powrotem.

Veger
źródło
Dziękuję Ci! To jest dokładnie to, czego szukałem.
kikito
2
To nie zadziałało, dopóki nie dodałem $stdout.sync=true. Edytowano.
Peter DeWeese,
2
$stdout.reopen("my.log", "w")wydaje się być bardziej eleganckim rozwiązaniem, widoczne pod adresem: stackoverflow.com/a/2480439/21217
dain
$stdout = File.new('console.out', 'w')zajmuje naprawdę dużo czasu. Używam okien. Nie jestem pewien, czy to jest powód!
dhrubo_moy
138

Szybkie jednorazowe rozwiązanie:

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

Utwórz urządzenie JSON:

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
Minimul
źródło
Dało mi to NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>lub undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
Magne
5
Gdzie jest plik, który statements.xmlzostanie zapisany w systemie. Nie mogę znaleźć pliku.
SujitS
1
Jest to lepsza odpowiedź, aby pokazać, jak zapisać zrzut konkretnego rekordu, zamiast mówić komuś, aby dodał kolejny klejnot lub wtyczkę (tak zmęczony zaleceniami oprogramowania, gdy nie jest potrzebny) LUB zrzucać wszystko z konsoli do pliku. Zagłosowano.
bshea
@SujitS - plik zostanie zapisany w katalogu, z którego został wykonany rails console(najprawdopodobniej w katalogu głównym aplikacji). (Przynajmniej tak było w moim przypadku).
user664833
13

Oprócz odpowiedzi Vegera jest jeszcze jeden sposób na zrobienie tego, który daje również wiele innych dodatkowych opcji.

Po prostu otwórz katalog projektu rails i wprowadź polecenie:

rails c | tee output.txt

Polecenie tee ma również wiele innych opcji, które możesz sprawdzić:

man tee
Chandra Agarwala
źródło
1
to nie zadziałało dla mnie ... Próbowałem uruchomić rails server | tee file.txti nie ma wyjścia do STDOUT lub pliku. Po prostu myślę, że serwer nie uruchamia się w tym przypadku.
kapad
serwer drukuje na stderr Myślę, że polecenie tee powinno zawierać opcje przekierowania tego również.
Kevin
Tak, zrób coś takiego rails console 2>&1 | tee file.txt. Nie jest to opcja w tee, po prostu proste przekierowanie stderr na stdout, więc oba kończą się w twoim pliku.txt.
labirynt
Plik zakończył się pełnym kodami kolorów konsoli. Użyj, ppaby uzyskać wydruk bez kodów kolorów.
Tim Abell
4

Jeśli napiszesz następujący kod w pliku środowiska, powinno działać.

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

Możesz również obrócić plik dziennika za pomocą

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

Możesz wykonywać tylko operacje związane z rejestrowaniem aktywnych rekordów

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

Pozwala to również mieć różne konfiguracje / pliki rejestratora dla różnych środowisk.

Chirantan
źródło
Jest to pomocne, ale druga odpowiedź robi to, co chciałem, w prostszy sposób. Mimo wszystko dziękuję za poświęcenie czasu na odpowiedź.
kikito
3

Używając Hirb, możesz wybrać rejestrowanie tylko wyjścia Hirb do pliku tekstowego. To sprawia, że ​​nadal możesz zobaczyć polecenia, które wpisujesz w oknie konsoli, a tylko wynik modelu zostanie przeniesiony do pliku.

Z pliku Readme Hirb :

Chociaż widoki są domyślnie drukowane na STDOUT, można je łatwo zmodyfikować, aby pisać w dowolnym miejscu:

# 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
Magne
źródło
Dzięki za to, dokładnie to, czego szukałem!
sbonami
2

Użyj hirb . Automatycznie stronicuje każde wyjście w irb, które jest dłuższe niż ekranowe. Umieść to w sesji konsoli, aby zobaczyć, jak działa:

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

Aby dowiedzieć się więcej o tym, jak to działa, przeczytaj ten post .

cldwalker
źródło
Dzięki za odpowiedź, ale nie szukałem paginacji; Chciałem zobaczyć wszystko na jednej stronie.
kikito
2

Spróbuj użyć scriptnarzędzia, jeśli używasz systemu operacyjnego opartego na systemie Unix.

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

To pomogło mi łatwo przechwycić bardzo długie dane wyjściowe skryptu uruchamiającego Rails do pliku.

Próbowałem użyć przekierowania do pliku, ale zostało to napisane dopiero na końcu skryptu.

To mi nie pomogło, ponieważ w moim skrypcie było kilka interaktywnych poleceń.

Następnie użyłem scripti uruchomiłem rails runnersesję w skrypcie, ale nie napisała wszystkiego. Następnie znalazłem to script -c "runner command here" output_filei zapisało wszystkie dane wyjściowe zgodnie z oczekiwaniami. To było na Ubuntu 14.04 LTS

Bibliografia:

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

Zapisywanie wyników konsoli Ruby do pliku tekstowego

Jignesh Gohel
źródło