rails - Chuyển hướng đầu ra của bảng điều khiển thành một tệp


81

Trên bảng điều khiển bash, nếu tôi làm điều này:

cd mydir
ls -l > mydir.txt

Toán tử> nắm bắt đầu vào chuẩn và chuyển hướng nó đến một tệp; vì vậy tôi nhận được danh sách các tệp trong mydir.txtthay vì ở đầu ra tiêu chuẩn.

Có cách nào để làm điều gì đó tương tự trên bảng điều khiển rails không?

Tôi có một câu lệnh ruby ​​tạo ra rất nhiều bản in (~ 8k dòng) và tôi muốn có thể nhìn thấy nó hoàn toàn, nhưng bảng điều khiển chỉ "nhớ" 1024 dòng cuối cùng hoặc lâu hơn. Vì vậy, tôi đã nghĩ đến việc chuyển hướng đến một tệp - Nếu ai đó biết một lựa chọn tốt hơn, tôi đang lắng nghe.

Câu trả lời:


106

Bạn có thể sử dụng ghi đè $stdoutđể chuyển hướng đầu ra bảng điều khiển:

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

Bạn cũng có thể cần gọi số này một lần:

$stdout.sync = true

Thao tác này sẽ chuyển hướng tất cả đầu ra đến tệp. Nếu bạn muốn tạm thời chuyển hướng đầu ra, hãy đảm bảo rằng bạn lưu trữ giá trị ban đầu của $stdoutnó để bạn có thể thay đổi nó trở lại.


Cảm ơn bạn! Điều này thật đúng với gì mà tôi đã tìm kiếm.
kikito

2
Nó không hoạt động cho tôi cho đến khi tôi thêm $stdout.sync=true. Đã chỉnh sửa.
Peter DeWeese

2
$stdout.reopen("my.log", "w")dường như là một giải pháp thanh lịch hơn, được xem tại: stackoverflow.com/a/2480439/21217
dain

$stdout = File.new('console.out', 'w')mất nhiều thời gian. Tôi đang sử dụng cửa sổ. Không chắc đó có phải là lý do!
dhrubo_moy

138

Một giải pháp nhanh chóng một lần:

irb:001> f = File.new('statements.xml', 'w')
irb:002> f << Account.find(1).statements.to_xml
irb:003> f.close

Tạo một vật cố định 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

Nó đã cho tôi NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>hoặc undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
Magne

5
Tập tin statements.xmlđược lưu ở đâu trong hệ thống. Tôi không thể tìm thấy tệp.
SujitS

1
Đây là câu trả lời tốt hơn để chỉ ra cách lưu kết xuất bản ghi cụ thể thay vì bảo ai đó thêm đá quý hoặc plugin khác (VẬY quá mệt mỏi với các đề xuất phần mềm khi không cần thiết) HOẶC kết xuất mọi thứ trong bảng điều khiển thành tệp. Đã bình chọn.
bshea

@SujitS - Tệp được lưu vào thư mục mà bạn đã thực thi rails console(rất có thể là thư mục gốc của ứng dụng của bạn). (Ít nhất đây là trường hợp của tôi.)
user664833 Ngày

13

Ngoài câu trả lời của Veger, có một trong những cách khác để làm điều đó cũng cung cấp nhiều tùy chọn bổ sung khác.

Chỉ cần mở thư mục dự án rails của bạn và nhập lệnh:

rails c | tee output.txt

lệnh tee cũng có nhiều tùy chọn khác mà bạn có thể kiểm tra bằng cách:

man tee

1
điều này không hiệu quả với tôi .. Tôi đã thử chạy rails server | tee file.txtvà không có đầu ra cho STDOUT hoặc tệp. Tôi chỉ nghĩ rằng máy chủ không thể khởi động trong trường hợp này.
kapad

Máy chủ in cho stderr Tôi nghĩ, cũng nên có các tùy chọn trong lệnh tee để chuyển hướng điều đó.
Kevin

Có, làm một cái gì đó như rails console 2>&1 | tee file.txt. Không phải là một tùy chọn trong tee, chỉ cần chuyển hướng đơn giản của stderr sang stdout để cả hai kết thúc trong file.txt của bạn.
mê cung

Tệp đã kết thúc đầy đủ các mã màu của bảng điều khiển. Sử dụng ppđể nhận đầu ra không có mã màu.
Tim Abell ngày

4

Nếu bạn viết mã sau trong tệp môi trường của mình, nó sẽ hoạt động.

if "irb" == $0
  config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))
end

Bạn cũng có thể xoay tệp nhật ký bằng cách sử dụng

config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'), number_of_files, file_roation_size_threshold)

Để chỉ ghi nhật ký các hoạt động liên quan đến bản ghi đang hoạt động, bạn có thể thực hiện

ActiveRecord::Base.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))

Điều này cũng cho phép bạn có cấu hình / tệp trình ghi nhật ký khác nhau cho các môi trường khác nhau.


Điều này hữu ích, nhưng câu trả lời khác làm những gì tôi muốn theo cách đơn giản hơn. Cảm ơn vì đã dành thời gian trả lời dù sao.
kikito

3

Sử dụng Hirb, bạn có thể chọn chỉ ghi đầu ra Hirb vào một tệp văn bản. Điều đó giúp bạn vẫn có thể xem các lệnh bạn nhập vào cửa sổ bảng điều khiển và chỉ đầu ra của mô hình sẽ được chuyển đến tệp.

Từ readme Hirb :

Mặc dù các dạng xem theo mặc định được in thành STDOUT, chúng có thể dễ dàng sửa đổi để ghi ở bất cứ đâu:

# 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

Cảm ơn vì điều này, chính xác những gì tôi đang tìm kiếm!
sbonami

2

Sử dụng hirb . Nó tự động trang bất kỳ đầu ra nào trong irb dài hơn một màn hình. Đặt nó trong một phiên bảng điều khiển để xem nó hoạt động:

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

Để biết thêm về cách thức hoạt động, hãy đọc bài đăng này .


Cảm ơn bạn đã trả lời, nhưng tôi không tìm kiếm phân trang; Tôi muốn xem mọi thứ trên một trang duy nhất.
kikito

2

Hãy thử sử dụng scripttiện ích nếu bạn đang sử dụng Hệ điều hành dựa trên Unix.

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

Điều đó đã giúp tôi dễ dàng ghi lại đầu ra rất dài của tập lệnh Rails runner vào một tệp.

Tôi đã thử sử dụng chuyển hướng đến một tệp nhưng nó chỉ được ghi ở cuối tập lệnh.

Điều đó không giúp được tôi vì tôi có ít lệnh tương tác trong tập lệnh của mình.

Sau đó, tôi chỉ sử dụng scriptvà sau đó chạy phiên rails runnertrong kịch bản nhưng nó không viết mọi thứ. Sau đó, tôi tìm thấy điều này script -c "runner command here" output_filevà nó đã lưu tất cả đầu ra như mong muốn. Điều này đã có trên Ubuntu 14.04 LTS

Người giới thiệu:

/ubuntu/290322/how-to-get-and-copy-a-too-long-output-compleently-in-terminal#comment1668695_715798

Viết đầu ra của bảng điều khiển Ruby thành tệp văn bản

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.