2013-10-03 40 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或操作系統刷新,則可能會出現問題。此外,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類,讓它爲你做所有的工作。

+1

偉大的信息在這裏。這非常有幫助,我實際上正努力尋找如何實時登錄,但這有助於。我遇到的問題是由於Mac上的「ctrl + c」和Windows上的「ctrl + pause/break」之間的區別。該腳本沒有關閉該文件,因此導致腳本在腳本結束時僅推送到日誌文件。當我在窗口上使用'ctrl + pause/break'時,日誌文件沒有填充任何內容。但是當我讓腳本自己完成時,日誌文件運行良好。感謝您的提示。 – Luigi

相關問題