rails - перенаправлення виводу консолі у файл


81

Якщо я це роблю на консолі bash:

cd mydir
ls -l > mydir.txt

Оператор> захоплює стандартний вхід і перенаправляє його у файл; отже, я отримую список файлів mydir.txtзамість стандартного виводу.

Чи є спосіб зробити щось подібне на консолі рейок?

У мене є твердження ruby, яке генерує багато відбитків (~ 8 тис. Рядків), і я хотів би мати можливість його бачити повністю, але консоль "запам'ятовує" лише останні 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>:(
Магне

5
Де файл statements.xmlзберігається в системі. Я не можу знайти файл.
SujitS

1
Це краща відповідь, щоб показати, як зберегти конкретний дамп запису, замість того, щоб сказати комусь додати ще один дорогоцінний камінь або плагін (ТАК набридли рекомендації програмного забезпечення, коли це не потрібно) АБО скидати все у консоль у файл. Проголосував.
bshea

@SujitS - файл зберігається в каталозі, з якого ви виконували rails console(швидше за все, кореневий каталог вашого додатка). (Принаймні, це було саме для мене.)
user664833 07.03.20

13

Окрім відповіді Вегера, є ще один спосіб зробити це, який також надає безліч інших додаткових опцій.

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

rails c | tee output.txt

Команда tee також має безліч інших варіантів, які ви можете перевірити за допомогою:

man tee

1
це не спрацювало для мене .. Я спробував запустити, rails server | tee file.txtі немає вихідних даних для STDOUT або файлу. Я просто думаю, що в цьому випадку сервер не запускається.
капад

Сервер друкує на 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

Використовуйте hirb . Він автоматично переглядає будь-який вихід у 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.