web-dev-qa-db-ja.com

rails-コンソール出力をファイルにリダイレクトする

Bashコンソールで、これを行うと:

cd mydir
ls -l > mydir.txt

>演算子は標準入力をキャプチャし、ファイルにリダイレクトします。だから、mydir.txt標準出力ではなく。

Railsコンソールで同様のことを行う方法はありますか?

Ruby大量のプリント(〜8k行)を生成するステートメントがあり、それを完全に見たいのですが、コンソールは最後の1024行のみを "記憶しています"だから、私はファイルへのリダイレクトを考えた-誰かがより良いオプションを知っていれば、私はすべて耳だ。

76
kikito

オーバーライド$stdoutを使用して、コンソール出力をリダイレクトできます。

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

また、これを一度呼び出す必要がある場合があります。

$stdout.sync = true

これにより、すべての出力がファイルにリダイレクトされます。出力を一時的にリダイレクトする場合は、$stdoutの元の値を保存して、元に戻せるようにしてください。

92
Veger

簡単な1回限りのソリューションを探している場合は、次を使用します。

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

JSONフィクスチャを作成する

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

Vegerの答えとは別に、他の多くの追加オプションを提供する方法が1つあります。

Railsプロジェクトディレクトリを開き、次のコマンドを入力します。

Rails c | tee output.txt

teeコマンドには、次の方法でチェックアウトできる他の多くのオプションもあります。

man tee
10

環境ファイルに次のコードを記述すると、動作するはずです。

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

次を使用してログファイルをローテーションすることもできます。

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

アクティブレコード関連の操作のみをログに記録するには、次の操作を行います。

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

これにより、環境ごとに異なるロガー設定/ファイルを使用できます。

4
Chirantan

Hirbを使用すると、Hirb出力のみをテキストファイルに記録することを選択できます。これにより、コンソールウィンドウに入力したコマンドを引き続き表示でき、モデルの出力のみがファイルに出力されます。

Hirb readme から:

デフォルトではビューはSTDOUTに出力されますが、簡単に変更してどこにでも書き込むことができます。

# 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
3
Magne

hirb を使用します。一画面よりも長いirbの出力を自動的にページングします。これをコンソールセッションに配置して、この動作を確認します。

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

この仕組みの詳細については、 この投稿を読む を参照してください。

2
cldwalker

UnixベースのOSを使用している場合は、scriptユーティリティを使用してみてください。

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

これは、Railsランナースクリプトの非常に長い出力を簡単にファイルにキャプチャするのに役立ちました。

ファイルへのリダイレクトを使用してみましたが、スクリプトの最後にしか書き込まれませんでした。

スクリプトにはインタラクティブなコマンドがほとんどなかったので、それは助けにはなりませんでした。

それからscriptだけを使用し、スクリプトセッションでRails runnerを実行しましたが、すべてを書いたわけではありませんでした。次に、このscript -c "runner command here" output_fileを見つけ、必要に応じてすべての出力を保存しました。これはUbuntu 14.04 LTSにありました

参照:

https://askubuntu.com/questions/290322/how-to-get-and-copy-a-too-long-output-completely-in-terminal#comment1668695_715798

Writing Rubyテキストファイルへのコンソール出力

1
Jignesh Gohel