처음에는 명확성을 위해 플래그를 사용하여 파일을 열고 생성하는 방법을 지정하지 않았습니다. 다음을 사용하십시오 :
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 클래스를 활용하고 모든 작업을 수행 할 수 있습니다.
루비의 버전은 무엇입니까? 파일을 만들었습니까? 예를 들어 파일을 삭제하면 재생성됩니까? "puts 'done' '과 같은이 섹션 뒤에 추가 출력이 있으면 화면에 출력됩니까? – rogerdpack
저는'ruby 1.9.3'을 사용하고 있습니다. 파일을 삭제했으며 파일을 다시 만듭니다. 로깅 전후에 여러 개의'puts' 명령을 사용하고 있는데, 둘 다 화면에 표시됩니다. – Luigi
당신은 돌아 서서 그 블록 안에서 그것을 읽고 있습니까? 이것은 나를 위해 작동합니다 : https://gist.github.com/rdp/6816673 – rogerdpack