Rails - перенаправление вывода консоли в файл

В консоли bash, если я это сделаю:

cd mydir
ls -l > mydir.txt

Оператоp > фиксирует стандартный ввод и перенаправляет его в файл; поэтому я получаю список файлов в mydir.txt вместо стандартного вывода.

Есть ли способ сделать что-то подобное на консоли rails?

У меня есть оператор ruby, который генерирует множество отпечатков (~ 8k строк), и я хотел бы видеть его полностью, но консоль только "запоминает" последние 1024 строки или около того. Поэтому я подумал о перенаправлении файла - если кто-то знает лучший вариант, я все уши.

Ответ 1

Вы можете использовать переопределение $stdout для перенаправления вывода консоли:

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

Вам также может потребоваться вызвать это один раз:

$stdout.sync = true

Это перенаправит весь вывод в файл. Если вы хотите временно перенаправить вывод, убедитесь, что вы сохранили исходное значение $stdout, чтобы изменить его.

Ответ 2

Если вы ищете быстрое одноразовое решение, просто используйте следующее:

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

Ответ 3

Если вы напишете следующий код в своем файле среды, он должен работать.

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

Используя 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 echo mode.
>> :blah
=> :blah

# Go back to printing Hirb views to STDOUT.
>> Hirb::View.reset_render_method

Ответ 5

Используйте hirb. Он автоматически печатает любой вывод в irb, который длиннее экрана. Поместите это в сеанс консоли, чтобы увидеть эту работу:

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

Подробнее о том, как это работает, прочитать этот пост.