rails - Konsol çıktısını bir dosyaya yeniden yönlendirme


81

Bir bash konsolunda, bunu yaparsam:

cd mydir
ls -l > mydir.txt

> Operatörü standart girişi yakalar ve bir dosyaya yeniden yönlendirir; bu yüzden mydir.txtstandart çıktı yerine dosyaların listesini alıyorum .

Ray konsolunda benzer bir şey yapmanın bir yolu var mı?

Çok sayıda baskı (~ 8k satır) oluşturan bir Ruby deyimim var ve bunu tamamen görebilmek istiyorum, ancak konsol yalnızca son 1024 satırı "hatırlıyor". Bu yüzden bir dosyaya yeniden yönlendirmeyi düşündüm - Daha iyi bir seçeneği bilen biri varsa, dinlerim.

Yanıtlar:


107

$stdoutKonsol çıktısını yeniden yönlendirmek için geçersiz kılmayı kullanabilirsiniz :

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

Bunu bir kez aramanız da gerekebilir:

$stdout.sync = true

Bu, tüm çıktıyı dosyaya yeniden yönlendirecektir. Çıkışı geçici olarak yeniden yönlendirmek istiyorsanız, orijinal değerini sakladığınızdan emin olun, $stdoutböylece eski haline döndürebilirsiniz.


Teşekkür ederim! Bu tam olarak aradığım şeydi.
kikito

2
Ben ekleyene kadar benim için işe yaramadı $stdout.sync=true. Düzenlendi.
Peter DeWeese

2
$stdout.reopen("my.log", "w")daha zarif bir çözüm gibi görünüyor, şu adreste görülüyor: stackoverflow.com/a/2480439/21217
dain

$stdout = File.new('console.out', 'w')gerçekten uzun zaman alıyor. Windows kullanıyorum. Nedenin bu olup olmadığından emin değilim!
dhrubo_moy

138

Hızlı bir tek seferlik çözüm:

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

Bir JSON fikstürü oluşturun:

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

Bana verdi NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>veya undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
Magne

5
Dosya statements.xmlsistemde nereye kaydedilir. Dosyayı bulamıyorum.
SujitS

1
Bu, birine başka bir mücevher veya eklenti eklemesini (gerekli olmadığında yazılım önerilerinden ÇOK bıktım) VEYA konsoldaki her şeyi dosyaya döktüğünü söylemek yerine, belirli kayıt dökümünün nasıl kaydedileceğini göstermek için daha iyi bir cevaptır. Oy verildi.
bshea

@SujitS - Dosya, çalıştırdığınız dizine kaydedilir rails console(büyük olasılıkla uygulamanızın kök dizini). (En azından benim için durum
buydu

13

Veger'in cevabının yanı sıra, bunu yapmanın başka birçok ek seçeneği de sunan başka bir yolu var.

Ray proje dizininizi açın ve komutu girin:

rails c | tee output.txt

tee command ayrıca kontrol edebileceğiniz birçok başka seçeneğe sahiptir:

man tee

1
bu benim için işe yaramadı .. rails server | tee file.txtÇalıştırmayı denedim ve STDOUT'a veya dosyaya çıktı yok. Sanırım sunucu bu durumda başlayamaz.
kapad

sunucu stderr'e yazdırır Sanırım tee komutunda bunu da yönlendirmek için seçenekler olmalı.
Kevin

Evet, şöyle bir şey yap rails console 2>&1 | tee file.txt. Tee'de bir seçenek değil, sadece stderr'in stdout'a basit bir şekilde yeniden yönlendirilmesi, böylece her ikisi de sizin file.txt dosyanıza gelir.
labirent

Dosya konsol renk kodlarıyla doluydu. ppRenk kodları olmadan çıktı almak için kullanın .
Tim Abell

4

Ortam dosyanıza aşağıdaki kodu yazarsanız, çalışması gerekir.

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

Günlük dosyasını şunu kullanarak da döndürebilirsiniz:

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

Yalnızca aktif kayıtla ilgili işlemleri günlüğe kaydetmek için,

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

Bu aynı zamanda farklı ortamlar için farklı logger yapılandırma / dosyalarına sahip olmanızı sağlar.


Bu yardımcı olabilir, ancak diğer cevap istediğimi daha basit bir şekilde yapıyor. Yine de cevaplamak için zaman ayırdığınız için teşekkürler.
kikito

3

Hirb kullanarak, yalnızca Hirb çıktısını bir metin dosyasına kaydetmeyi seçebilirsiniz. Bu, konsol penceresine yazdığınız komutları görmenizi sağlar ve yalnızca model çıktısı dosyaya gider.

Gönderen Hirb Benioku'da :

Görünümler varsayılan olarak STDOUT olarak yazdırılsa da, herhangi bir yere yazmak için kolayca değiştirilebilirler:

# 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

Bunun için teşekkürler, tam olarak aradığım şey!
sbonami

2

Hirb kullan . Bir ekrandan daha uzun olan irb'deki herhangi bir çıktıyı otomatik olarak sayfalar. Bunun işe yaradığını görmek için bunu bir konsol oturumuna koyun:

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

Bunun nasıl çalıştığı hakkında daha fazla bilgi için bu yazıyı okuyun .


Cevap verdiğiniz için teşekkürler, ancak sayfalandırma aramıyordum; Her şeyi tek bir sayfada görmek istedim.
kikito

2

scriptUnix tabanlı işletim sistemindeyseniz yardımcı programı kullanmayı deneyin .

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

Bu, bir Rails çalıştırıcı betiğinin çok çok uzun çıktısını kolayca bir dosyaya kaydetmeme yardımcı oldu.

Bir dosyaya yönlendirmeyi kullanmayı denedim, ancak yalnızca komut dosyasının sonunda yazıldı.

Bu bana yardımcı olmadı çünkü senaryomda birkaç etkileşimli komutum vardı.

Sonra sadece kullandım scriptve sonra rails runnersenaryo oturumunu çalıştırdım ama her şeyi yazmadı. Sonra bunu buldum script -c "runner command here" output_fileve tüm çıktıyı istendiği gibi kaydetti. Bu, Ubuntu 14.04 LTS'deydi

Referanslar:

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

Ruby Konsol Çıktısını Metin Dosyasına Yazma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.