rails-콘솔 출력을 파일로 리디렉션


81

bash 콘솔에서 이렇게하면 :

cd mydir
ls -l > mydir.txt

> 연산자는 표준 입력을 캡처하여 파일로 리디렉션합니다. 그래서 mydir.txt표준 출력 대신에 파일 목록을 얻습니다 .

레일 콘솔에서 비슷한 작업을 수행 할 수있는 방법이 있습니까?

많은 인쇄물 (~ 8k 줄)을 생성하는 루비 문이 있고이를 완전히보고 싶지만 콘솔은 마지막 1024 줄 정도만 "기억"합니다. 그래서 파일로 리디렉션하는 방법에 대해 생각했습니다. 더 나은 옵션을 아는 사람이 있다면 모두 귀입니다.

답변:


107

재정의 $stdout를 사용 하여 콘솔 출력을 리디렉션 할 수 있습니다 .

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

다음과 같이 한 번만 호출해야 할 수도 있습니다.

$stdout.sync = true

그러면 모든 출력이 파일로 리디렉션됩니다. 출력을 일시적으로 리디렉션하려면 원래 값을 저장하여 $stdout다시 변경할 수 있는지 확인하십시오 .


감사합니다! 이것이 바로 제가 찾던 것입니다.
kikito

2
내가 추가하기 전까지는 작동하지 않았습니다 $stdout.sync=true. 편집.
Peter DeWeese 2012

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>:(
Magne

5
statements.xml시스템에서 파일 이 저장되는 위치입니다. 파일을 찾을 수 없습니다.
SujitS

1
이것은 누군가에게 다른 gem이나 플러그인을 추가하라고 말하거나 (필요하지 않을 때 소프트웨어 권장 사항에 지쳐서) 콘솔의 모든 것을 파일에 덤프하는 것보다 특정 레코드 덤프를 저장하는 방법을 보여주는 더 좋은 대답입니다. 투표했습니다.
bshea

@SujitS-파일은 실행 한 디렉토리 rails console(대부분 앱의 루트 디렉토리)에 저장됩니다. (적어도이 경우가 해당됩니다.)
user664833

13

Veger의 답변 외에도 다른 많은 추가 옵션을 제공하는 또 다른 방법이 있습니다.

rails 프로젝트 디렉토리를 열고 다음 명령을 입력하십시오.

rails c | tee output.txt

tee 명령에는 다음을 통해 확인할 수있는 다른 많은 옵션도 있습니다.

man tee

1
이것은 나를 위해 작동하지 않았습니다 .. 실행을 시도했지만 rails server | tee file.txtSTDOUT 또는 파일에 대한 출력이 없습니다. 이 경우 서버가 시작되지 않는다고 생각합니다.
kapad

서버는 stderr로 인쇄합니다. tee 명령에도 옵션이 있어야 리디렉션됩니다.
케빈

예, rails console 2>&1 | tee file.txt. tee의 옵션이 아니라 stderr을 stdout으로 간단히 리디렉션하므로 둘 다 file.txt로 끝납니다.
labyrinth

파일은 콘솔 색상 코드로 가득 차 있습니다. pp색상 코드없이 출력 할 때 사용 합니다.
Tim Abell

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

감사합니다. 정확히 제가 찾던 것입니다!
sbonami

2

hirb를 사용하십시오 . screenful보다 긴 irb의 모든 출력을 자동으로 페이징합니다. 이 작업을 보려면 콘솔 세션에 넣으십시오.

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

작동 방식에 대한 자세한 내용은 이 게시물을 참조하십시오 .


답변 해 주셔서 감사합니다.하지만 페이지 매김을 찾고있는 것이 아닙니다. 한 페이지에서 모든 것을보고 싶었습니다.
kikito

2

scriptUnix 기반 OS 를 사용하는 경우 유틸리티를 사용해보십시오 .

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에있었습니다.

참조 :

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

Ruby 콘솔 출력을 텍스트 파일에 쓰기

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.