要寫入 linux 系統上的日志檔案,我首先創建一個包含所有內容的臨時檔案。之后,我用 os.replace 替換日志檔案,因為據說它是原子的。
if os.path.exists(log_file_path):
with open(log_file_path, 'r') as f:
existing = json.load(f)
else:
existing = list()
existing.append(event.error_log())
with open(temp_file_name, 'a ') as f:
json.dump(existing, f, indent=2, default=vars)
os.replace(temp_file_name, log_file_path)
由于重新啟動而將信號 15 發送到我的服務時,此代碼的輸出是意外的。執行后,檔案不再解碼為json,有內容,一起設定如下:
寫訪問前的檔案內容:
[complete log]
寫訪問后的檔案內容:
[partial logs
[complete log]
第一個串列沒有右括號,僅包含寫入訪問之前檔案中的部分事件。第二個串列是寫訪問之前的完整日志,以及添加的事件。
有誰知道,這里發生了什么?
uj5u.com熱心網友回復:
您將一些資料寫入臨時檔案,然后行程在完成之前被關閉。
然后在下一次運行時,您將新資料附加到上一次運行中寫入一半的垃圾,而不是丟棄該垃圾,因為您的代碼以a 模式而不是w或w 模式打開臨時檔案。
然后,您將原始檔案替換為仍包含半寫垃圾的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/527342.html
