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чтобы его можно было изменить обратно.


Спасибо! Это именно то, что я искал.
— 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

Это дало мне 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'))

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


Это полезно, но другой ответ делает то, что я хотел, более простым способом. Все равно спасибо, что нашли время ответить.
— 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

Спасибо за это, именно то, что я искал!
— сбонами

2

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

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

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


Спасибо за ответ, но я не искал разбиения на страницы; Я хотел видеть все на одной странице.
— 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 в текстовый файл

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.