項目日誌出現莫名其妙的缺失,從當天某個時間段之後日誌就全部沒有了。日誌每3秒寫入一次,文件最後的修改時間距離日誌最後記錄的時間相差幾分鐘,排除人爲刪除的因素之後,技術層面發現了一些問題。
Writer的創建
PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF-8"));
日誌寫入
writer.println(data);
writer.flush();
檢查發現,日誌寫入時文件是一直被佔用的。若強行解除文件佔用,就會出現文件無法寫入,而且不會拋出異常的問題。初步判斷爲人爲查看日誌時意外修改導致文件被解除佔用,具體原因不明。
修正方法:寫入數據後使用writer.checkError()方法檢查是否存在錯誤,若有,則重新創建writer,將數據再寫一遍。
java.io.PrintWriter 此類中的方法不會拋出 I/O 異常,儘管其某些構造方法可能拋出異常。客戶端可能需要通過調用 checkError() 檢查是否出現錯誤。
java.io.PrintWriter.checkError()
該方法刷新流,如果它尚未關閉,並檢查其錯誤狀態。
如果打印流在底層輸出流或格式轉換期間遇到錯誤,該方法返回true
修正代碼:
writer.println(data);
if (writer.checkError())
{
try
{
createWriter();
writer.println(data);
if (writer.checkError())
{
Log.error("日誌重建異常!data:" + data);
}
}
catch (Exception e)
{
Log.error("日誌寫入異常!" + data, e);
}
}
writer.flush();