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


81

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

cd mydir
ls -l > mydir.txt

>演算子は標準入力をキャプチャし、それをファイルにリダイレクトします。そのためmydir.txt、標準出力ではなく、ファイルのリストを取得します。

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

たくさんのプリント(〜8k行)を生成するrubyステートメントがあり、それを完全に表示したいのですが、コンソールは最後の1024行程度しか「記憶」していません。だから私はファイルにリダイレクトすることを考えました-誰かがより良いオプションを知っているなら、私はすべての耳です。

回答:


106

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

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

また、これを1回呼び出す必要がある場合もあります。

$stdout.sync = true

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


ありがとうございました!これはまさに私が探していたものです。
kikito 2010年

2
追加するまでは機能しませんでした$stdout.sync=true。編集。
Peter DeWeese 2012

2
$stdout.reopen("my.log", "w")よりエレガントなソリューションのようです:stackoverflow.com/a/2480439/21217
dain

$stdout = File.new('console.out', 'w')本当に長い時間がかかります。私はウィンドウズを使用しています。それが理由かどうかわからない!
dhrubo_moy 2016

138

迅速な1回限りの解決策:

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

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

それは私に与えたNoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>または:undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>
マグネ

5
ファイルstatements.xmlはシステムのどこに保存されますか。ファイルが見つかりません。
SujitS 2015年

1
これは、誰かにさらに別のgemまたはプラグインを追加するように指示したり(不要なときにソフトウェアの推奨事項にうんざりしている)、コンソール内のすべてをファイルにダンプするよりも、特定のレコードダンプを保存する方法を示すためのより良い答えです。投票しました。
bshea 2016

@ SujitS-ファイルは、実行元のディレクトリrails console(ほとんどの場合アプリのルートディレクトリ)に保存されます。(少なくともこれは私の場合でした。)
user6648333月

13

Vegerの答えとは別に、それを行う方法が1つあり、他にも多くの追加オプションがあります。

Railsプロジェクトディレクトリを開いて、次のコマンドを入力するだけです。

rails c | tee output.txt

teeコマンドには、他にも多くのオプションがあり、次の方法で確認できます。

man tee

1
これは私にはうまくいきませんでした..実行しようrails server | tee file.txtとしましたが、STDOUTまたはファイルへの出力がありません。この場合、サーバーは起動に失敗すると思います。
kapad

サーバーはstderrに出力します。teeコマンドにはそれをリダイレクトするオプションもあるはずです。
ケビン

はい、のようなことをしrails console 2>&1 | tee file.txtます。teeのオプションではなく、stderrをstdoutにリダイレクトするだけなので、両方ともfile.txtになります。
ラビリンス

ファイルはコンソールのカラーコードでいっぱいになりました。ppカラーコードなしで出力を取得するために使用します。
ティムアベル

4

環境ファイルに次のコードを記述すれば、機能するはずです。

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'))

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


これは役に立ちますが、他の答えは私が望んでいたことをより簡単な方法で行います。とにかく答えるために時間を割いてくれてありがとう。
kikito 2010年

3

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

Hirbreadmeから

ビューはデフォルトで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

これをありがとう、まさに私が探していたものです!
sbonami 2015年

2

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

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

これがどのように機能するかについての詳細は、この投稿を読んでください


回答していただきありがとうございますが、ページ付けを探していませんでした。すべてを1ページに表示したかったのです。
kikito 2010年

2

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

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

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

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

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

次に、スクリプトセッションを使用してscript実行しrails runnerましたが、すべてが書き込まれるわけではありませんでした。それから私はこれを見つけました、script -c "runner command here" output_fileそしてそれは望み通りにすべての出力を保存しました。これはUbuntu14.04LTSにありました

参照:

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

Rubyコンソール出力をテキストファイルに書き込む

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.