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

81

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

cd mydir
ls -l > mydir.txt

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

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

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

кикито
источник

Ответы:

107

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

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

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

$stdout.sync = true

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

Veger
источник
Спасибо! Это именно то, что я искал.
kikito
2
У меня это не сработало, пока я не добавил $stdout.sync=true. Отредактировано.
Питер ДеВиз,
2
$stdout.reopen("my.log", "w")кажется более элегантным решением: stackoverflow.com/a/2480439/21217
dain
$stdout = File.new('console.out', 'w')занимает очень много времени. Я использую окна. Не уверен, что это причина!
dhrubo_moy
138

Быстрое разовое решение:

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
Minimul
источник
Это дало мне NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>или undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
Magne
5
Где файл statements.xmlсохраняется в системе. Я не могу найти файл.
SujitS
1
Это лучший ответ, чтобы показать, как сохранить конкретный дамп записи, вместо того, чтобы говорить кому-то добавить еще один драгоценный камень или плагин (ТАК устал от рекомендаций программного обеспечения, когда они не нужны) ИЛИ сбрасывать все в консоли в файл. Проголосовал.
bshea
@SujitS - файл сохраняется в каталоге, из которого вы запустили rails console(скорее всего, в корневом каталоге вашего приложения). (По крайней мере, так было со мной.)
user664833
13

Помимо ответа Вегера, есть еще один способ сделать это, который также предоставляет множество других дополнительных опций.

Просто откройте каталог вашего проекта rails и введите команду:

rails c | tee output.txt

Команда tee также имеет множество других опций, которые вы можете проверить:

man tee
Чандра Агарвала
источник
1
это не сработало для меня .. Я попытался запустить rails server | tee file.txt, но нет вывода в STDOUT или в файл. Я просто думаю, что в этом случае сервер не запускается.
kapad 02
сервер печатает на 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'))

Это также позволяет вам иметь разные конфигурации / файлы регистратора для разных сред.

Chirantan
источник
Это полезно, но другой ответ делает то, что я хотел, более простым способом. Все равно спасибо, что нашли время ответить.
kikito
3

Используя Hirb, вы можете записывать в текстовый файл только вывод Hirb. Это позволяет вам по-прежнему видеть команды, которые вы вводите в окне консоли, и только выходные данные модели будут попадать в файл.

Из ридми Hirb :

Хотя представления по умолчанию выводятся в 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
Magne
источник
Спасибо за это, именно то, что я искал!
сбонами
2

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

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

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

cldwalker
источник
Спасибо за ответ, но я не искал разбиения на страницы; Я хотел видеть все на одной странице.
kikito
2

Попробуйте использовать scriptутилиту, если вы работаете в ОС на базе Unix.

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

Это помогло мне легко записать очень-очень длинный вывод сценария Rails runner в файл.

Я пробовал использовать перенаправление в файл, но он записывался только в конце скрипта.

Это мне не помогло, потому что в моем скрипте было мало интерактивных команд.

Затем я использовал только, scriptа затем запустил rails runnerсеанс сценария, но он не написал все. Затем я нашел это, script -c "runner command here" output_fileи он сохранил весь вывод, как и ожидалось. Это было на Ubuntu 14.04 LTS

Рекомендации:

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

Запись вывода консоли Ruby в текстовый файл

Джигнеш Гохель
источник