【问题标题】:rails - Redirecting console output to a filerails - 将控制台输出重定向到文件
【发布时间】:2023-03-19 12:54:01
【问题描述】:

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

cd mydir
ls -l > mydir.txt

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby file console


    【解决方案1】:

    一种快速的一次性解决方案:

    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 #&lt;Blog:0x007fdaadbe4530&gt;undefined method 'statements' for #&lt;ActiveRecord::Relation:0x007fdaaaf4f880&gt; :(
    • 文件statements.xml在哪里保存在系统中。我找不到文件。
    • 这是展示如何保存特定记录转储的更好答案,而不是告诉某人添加另一个 gem 或插件(在不需要时厌倦了软件推荐)或将控制台中的所有内容转储到文件。投票赞成。
    • @SujitS - 文件被保存到您执行 rails console 的目录中(很可能是您的应用程序的根目录)。 (至少对我来说是这样。)
    【解决方案2】:

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

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

    您可能还需要调用一次:

    $stdout.sync = true
    

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

    【讨论】:

    • 谢谢!这正是我想要的。
    • 在我添加 $stdout.sync=true 之前它对我不起作用。已编辑。
    • $stdout.reopen("my.log", "w") 似乎是一个更优雅的解决方案,参见:stackoverflow.com/a/2480439/21217
    • $stdout = File.new('console.out', 'w') 花了很长时间。我正在使用窗户。不知道是不是这个原因!
    【解决方案3】:

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

    只要打开你的rails项目目录,输入命令:

    rails c | tee output.txt
    

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

    man tee
    

    【讨论】:

    • 这对我不起作用。我尝试运行rails server | tee file.txt,但没有输出到 STDOUT 或文件。我只是认为在这种情况下服务器无法启动。
    • 服务器打印到 stderr 我认为,tee 命令中也应该有选项来重定向它。
    • 是的,请执行rails console 2&gt;&amp;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'))
    

    这也让您可以为不同的环境使用不同的记录器配置/文件。

    【讨论】:

    • 这很有帮助,但另一个答案以更简单的方式完成了我想要的。无论如何,感谢您花时间回答。
    【解决方案5】:

    使用 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
    

    【讨论】:

    • 谢谢你,正是我想要的!
    【解决方案6】:

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

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

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

    【讨论】:

    • 感谢您的回答,但我不是在寻找分页;我想在一个页面上查看所有内容。
    【解决方案7】:

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

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

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

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

    这对我没有帮助,因为我的脚本中几乎没有交互式命令。

    然后我只使用了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

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多