首先,爲了清楚起見,我不會使用標誌來指定如何打開/創建文件。我會用:
File.open(filename, 'a')
這是日誌文件的標準模式;如果它不存在,您想要創建它,並且如果它確實需要附加它。
日誌記錄通常需要通過應用程序的運行時間多次寫入同一個文件。人們喜歡打開日誌並保持打開狀態,但如果代碼在文件關閉之前崩潰,或者Ruby或操作系統刷新,則可能會出現問題。此外,Ruby和操作系統的內置緩衝區可以導致文件緩衝,然後刷新,當你拖動文件時,它會使它跳入大塊,如果你是在看什麼。
你可以告訴紅寶石時通過設置sync = true
寫入文件強制立即清空:
logfile = File.open(filename, 'a')
logfile.sync = true
logfile.puts 'foo'
logfile.close
你可以使用fsync
,這也迫使OS刷新其緩衝區。
以任何一種方式強制同步的缺點是您會否定緩衝I/O的優勢。對於正常的文件寫入,如文本文件,請勿使用sync
,因爲您會減慢應用程序的速度。相反,讓正常的I/O發生在Ruby和操作系統需要的時候。但是對於日誌記錄來說它是可以接受的,因爲日誌記錄應該週期性地發送一行文本,而不是一大堆文本。
,你可以立即flush
輸出,而是變得多餘,違反了DRY原則:
logfile = File.open(filename, 'a')
logfile.puts 'foo'
logfile.flush
logfile.puts 'bar'
logfile.flush
logfile.close
close
實際關閉的文件I/O之前刷新。
你可以用你的日誌輸出的方法:
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