2013-10-03 2 views
0

필자는 Mac에서 잘 작동하는 스크립트를 작성했습니다.Ruby 로그 파일이 Windows에서는 작동하지 않지만 Mac OS에서 작동합니까?

filename = "2011" 
    File.open(filename, File::WRONLY|File::CREAT|File::EXCL) do |logfile| 
    logfile.puts "MemberID,FirstName,LastName,BadEmail,gender,dateofbirth,ActiveStatus,Phone" 

Windows에서 스크립트가 잘 실행하고 로그 파일 2011을 만들지 만 그 로그 파일에 실제로 puts 아무것도 않기 때문에 파일이 생성이 스크립트가 실행 : 그것은 코드의 라인을 가지고 , 그러나 로깅은 발생하지 않습니다.

이유를 아는 사람이 있습니까? 로깅을 중단시키는 스크립트의 실제 기능이 어떻게 바뀌 었는지 생각할 수 없습니다.

+0

루비의 버전은 무엇입니까? 파일을 만들었습니까? 예를 들어 파일을 삭제하면 재생성됩니까? "puts 'done' '과 같은이 섹션 뒤에 추가 출력이 있으면 화면에 출력됩니까? – rogerdpack

+0

저는'ruby 1.9.3'을 사용하고 있습니다. 파일을 삭제했으며 파일을 다시 만듭니다. 로깅 전후에 여러 개의'puts' 명령을 사용하고 있는데, 둘 다 화면에 표시됩니다. – Luigi

+0

당신은 돌아 서서 그 블록 안에서 그것을 읽고 있습니까? 이것은 나를 위해 작동합니다 : https://gist.github.com/rdp/6816673 – rogerdpack

답변

1

처음에는 명확성을 위해 플래그를 사용하여 파일을 열고 생성하는 방법을 지정하지 않았습니다. 다음을 사용하십시오 :

File.open(filename, 'a') 

로그 파일의 표준 모드입니다. 존재하지 않을 경우 생성하고, 추가 할 경우 추가하려고합니다.

로깅은 일반적으로 응용 프로그램의 실행 시간을 통해 동일한 파일에 여러 번 기록해야합니다. 사람들은 로그를 열고 열어두고 싶어하지만 파일이 닫히기 전에 코드가 충돌하거나 Ruby 나 OS에 의해 플러시되는 경우 문제가 발생할 가능성이 있습니다. 또한 Ruby와 OS에 내장 된 버퍼링은 파일을 버퍼링 한 다음 플러시 할 수 있습니다. 파일을 꼬리로 감싸면 커다란 덩어리로 점프됩니다. 뭔가를 지켜 보면서.

당신은 당신이 sync = true을 설정하여 파일에 쓸 때 즉시 씻어 강제로 루비를 알 수 있습니다 :

logfile = File.open(filename, 'a') 
logfile.sync = true 
logfile.puts 'foo' 
logfile.close 

또한 버퍼를 플러시 할 수있는 OS를 강제로 fsync을 사용할 수 있습니다.

강제 동기화의 단점은 I/O를 버퍼링하는 장점을 없애는 것입니다. 텍스트 파일처럼 일반적인 파일 쓰기의 경우 응용 프로그램의 속도가 느려지므로 sync을 사용하지 마십시오. Ruby와 OS가 원하는대로 정상적인 I/O를 수행하도록하십시오. 그러나 로깅을 위해서는 로깅이 주기적으로 줄을 보내야하며, 큰 텍스트가 아닌 줄을 보내야하기 때문에 용인 될 수 있습니다.

당신은 할 수 즉시 flush 출력

, 그러나 그것은 DRY 원칙을 중복 얻고 위반 : 실제로 파일 I/O를 닫기 전에

logfile = File.open(filename, 'a') 
logfile.puts 'foo' 
logfile.flush 
logfile.puts 'bar' 
logfile.flush 
logfile.close 

close 플러시.

def log(text) 
    File.open(log_file, 'a') do |logout| 
    logout.puts(text) 
    end 
end 

즉, 닫은 다음, 로그 파일을 열 수 있습니다, 자동으로 버퍼를 플러시하고 sync을 사용할 필요가 부정 :

당신은 방법에 로깅 출력을 포장 할 수 있습니다.

또는 Ruby의 Logger 클래스를 활용하고 모든 작업을 수행 할 수 있습니다.

+1

여기에 좋은 정보가 있습니다. 이것은 엄청난 도움이됩니다. 실제로 로그인하는 방법을 찾으려고 애 쓰고 있지만 이것이 도움이됩니다. 내가 겪고있는 문제는 위의 사항과 결합 된 Mac의 경우 'ctrl + c'와 'ctrl + pause/break'의 차이 때문이었습니다. 스크립트가 파일을 닫지 않아서 스크립트가 끝날 때만 로그 파일로 이동합니다. 창에서'ctrl + pause/break'를 사용할 때, 로그 파일은 아무것도 채워지지 않았습니다. 그러나 스크립트를 끝내면 로그 파일이 정상적으로 작동합니다. 팁 주셔서 감사. – Luigi

관련 문제