3 回答

TA貢獻(xiàn)1816條經(jīng)驗 獲得超4個贊
我過去在沒有其他選擇的情況下使用的一個技巧只是重命名當(dāng)前日志文件。
重命名后,排隊等待它的任何未完成的日志記錄都會繼續(xù)進(jìn)入重命名的日志記錄。通常,任何新的日志請求都會創(chuàng)建一個新文件。
剩下的就是清理重命名的。您通??梢允褂靡恍┩獠窟M(jìn)程來管理它,或者只要這個進(jìn)程觸發(fā)就刪除任何舊的日志文件。

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊
文件系統(tǒng)通常由操作系統(tǒng)同步,因此您可以簡單地刪除文件而不必?fù)?dān)心鎖定或任何事情。根據(jù) log4j 鎖定文件的方式,刪除過程可能會失敗,您需要添加一個重試循環(huán)。
int attempts = 3;
final File logfile = new File(theLogFilePath);
while ((attempts > 0) && logfile.exists() && !logfile.delete()) {
--attempts;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
attempts = 0;
}
}
這不是完全干凈的代碼,但是無論如何你所做的都不干凈。;)
您相當(dāng)粗魯?shù)馗蓴_了日志記錄過程,但由于用戶也可以隨時刪除該文件,因此 log4j 應(yīng)該優(yōu)雅地處理它。最壞的情況是,我的猜測是即將被記錄的消息會丟失,但考慮到您無論如何都只是刪除了日志文件,這可能不是問題。
有關(guān)更清晰的實現(xiàn),請參閱此問題。
添加回答
舉報