rails-将控制台输出重定向到文件


81

在bash控制台上,如果我这样做:

cd mydir
ls -l > mydir.txt

>运算符捕获标准输入并将其重定向到文件;所以我得到文件列表mydir.txt而不是标准输出。

有什么办法可以在Rails控制台上做类似的事情吗?

我有一个ruby语句,该语句会生成大量打印件(约8k行),我希望能够完全看到它,但是控制台仅“记住”了最后1024行左右。因此,我考虑过重定向到文件-如果有人知道更好的选择,我将不知所措。

Answers:


106

您可以使用override$stdout重定向控制台输出:

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

您可能还需要调用一次:

$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 2012年

$stdout = File.new('console.out', 'w')花了很长时间。我正在使用Windows。不知道那是原因!
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 2015年

5
文件在哪里statements.xml保存在系统中。我找不到文件。
SujitS,2015年

1
这是显示如何保存特定记录转储的更好答案,而不是告诉某人添加另一个gem或插件(不需要时不推荐软件)或将控制台中的所有内容转储到文件中。投票了。
bshea

@SujitS-文件被保存到执行目录rails console(很可能是应用程序的根目录)中。(至少我是这种情况。)
user664833

13

除了Veger的答案外,还有一种做起来的方法,它还提供了许多其他附加选项。

只需打开您的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输出记录到文本文件中。这样一来,您仍然可以在控制台窗口中看到键入的命令,仅模型输出将进入该文件。

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

正是由于这个,我一直在寻找!
sbonami 2015年

2

使用hirb。它会自动分页irb中比屏幕更长的所有输出。将其放在控制台会话中以查看此工作:

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

有关其工作原理的更多信息,请阅读这篇文章


感谢您的回答,但我不是在寻找分页。我想在单个页面上看到所有内容。
kikito 2010年

2

script如果您使用的是基于Unix的操作系统,请尝试使用实用程序。

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

这帮助我轻松地将Rails Runner脚本的非常长的输出捕获到文件中。

我尝试使用重定向到文件,但仅在脚本末尾写入。

那对我没有帮助,因为我的脚本中很少有交互式命令。

然后我只使用script了一个rails runner脚本,然后运行了in脚本会话,但是它并没有编写所有内容。然后我发现了这一点,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控制台输出写入文本文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.