3 回答

TA贡献1816条经验 获得超4个赞
我过去在没有其他选择的情况下使用的一个技巧只是重命名当前日志文件。
重命名后,排队等待它的任何未完成的日志记录都会继续进入重命名的日志记录。通常,任何新的日志请求都会创建一个新文件。
剩下的就是清理重命名的。您通常可以使用一些外部进程来管理它,或者只要这个进程触发就删除任何旧的日志文件。

TA贡献1828条经验 获得超3个赞
文件系统通常由操作系统同步,因此您可以简单地删除文件而不必担心锁定或任何事情。根据 log4j 锁定文件的方式,删除过程可能会失败,您需要添加一个重试循环。
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;
}
}
这不是完全干净的代码,但是无论如何你所做的都不干净。;)
您相当粗鲁地干扰了日志记录过程,但由于用户也可以随时删除该文件,因此 log4j 应该优雅地处理它。最坏的情况是,我的猜测是即将被记录的消息会丢失,但考虑到您无论如何都只是删除了日志文件,这可能不是问题。
有关更清晰的实现,请参阅此问题。
添加回答
举报