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

时间:2010-03-17 10:37:25

标签: ruby-on-rails ruby file console

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

cd mydir
ls -l > mydir.txt

>操作员捕获标准输入并将其重定向到文件;所以我在mydir.txt而不是标准输出中获得了文件列表。

有没有办法在rails控制台上做类似的事情?

我有一个产生大量打印(~8k行)的ruby语句,我希望能够完全看到它,但控制台只能“记住”最后1024行左右。所以我想重定向到一个文件 - 如果有人知道一个更好的选择,我会全力以赴。

7 个答案:

答案 0 :(得分:126)

如果您正在寻找快速的一次性解决方案,只需使用以下内容:

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 fixture

>> f = File.new(Rails.root + 'spec/fixtures/qbo/amy_cust.json', 'w')
>> f << JSON.pretty_generate((q.get :customer, 1).as_json)
>> f.close

答案 1 :(得分:90)

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

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

您可能还需要拨打一次电话:

$stdout.sync = true

这会将所有输出重定向到文件。如果您想暂时重定向输出,请确保存储原始值$stdout,以便您可以将其更改回来。

答案 2 :(得分:9)

除了Veger的答案之外,还有一种方法可以做到这一点,它还提供了许多其他选择。

只需打开rails项目目录并输入命令:

rails c | tee output.txt

tee命令还有许多其他选项,您可以通过以下方式查看:

man tee

答案 3 :(得分: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'))

这也允许您为不同的环境提供不同的记录器配置/文件。

答案 4 :(得分:3)

使用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's echo mode.
>> :blah
=> :blah

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

答案 5 :(得分:2)

使用hirb。它会自动将irb中任何超过屏幕的输出分页。将它放在控制台会话中以查看此工作:

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

有关其工作原理的更多信息,请read this post

答案 6 :(得分:1)

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

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

参考文献:

https://askubuntu.com/questions/290322/how-to-get-and-copy-a-too-long-output-completely-in-terminal#comment1668695_715798

Writing Ruby Console Output to Text File