簡體   English   中英

Ruby日志文件無法在Windows上運行,但可以在Mac OS上運行?

[英]Ruby log file doesn't work on Windows, but works on Mac OS?

我寫了一個可以在Mac上正常運行的腳本。 它包含以下代碼行:

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其他類似的日志文件,所以在文件被創建,腳本運行,但記錄不會發生。

有人知道為什么嗎? 我想不出腳本的實際功能發生了什么變化,從而導致日志記錄停止。

首先,為清楚起見,我不會使用標志來指定如何打開/創建文件。 我會用:

File.open(filename, 'a')

這是日志文件的標准模式。 如果它不存在,則要創建它;如果不存在,則要附加它。

日志記錄通常需要在應用程序運行期間多次寫入同一文件。 人們喜歡打開日志並保持打開狀態,但是如果代碼在關閉文件之前崩潰或被Ruby或OS刷新,則可能會出現問題。 另外,Ruby和OS的內置緩沖可能導致文件緩沖,然后刷新,這在拖尾文件時會使文件跳得很大,如果您拖尾,則效果不佳看東西。

您可以通過設置sync = true來告訴Ruby在寫入文件時立即強制刷新:

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

您可以使用fsync ,這也會強制操作系統刷新其緩沖區。

以任何一種方式強制進行同步的不利之處在於,您無法利用緩沖I / O的優勢。 對於普通文件寫入(如文本文件寫入),請不要使用sync因為這樣會使應用程序變慢。 而是讓正常的I / O隨Ruby和OS的需要而發生。 但是對於日志記錄來說,這是可以接受的,因為日志記錄應該定期發送一行,而不是發送大量文本。

您可以立即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類,讓它為您完成所有工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM