Java 如何在登录回写时处理磁盘已满错误?
我正在使用slf4j+logback登录我们的应用程序。之前我们使用的是jcl+log4j,最近才移动 由于我们的应用程序中有大量日志记录,所以在生产环境中有可能磁盘已满。在这种情况下,我们需要停止日志记录,应用程序应该可以正常工作。我从网络上发现,我们需要对此类错误轮询logback StatusManager。但这将为应用程序添加一个带有logback的依赖项。 对于log4j,我发现我们可以创建一个Appender,在这种情况下停止登录。这将再次导致应用程序依赖于log4jJava 如何在登录回写时处理磁盘已满错误?,java,logging,slf4j,logback,Java,Logging,Slf4j,Logback,我正在使用slf4j+logback登录我们的应用程序。之前我们使用的是jcl+log4j,最近才移动 由于我们的应用程序中有大量日志记录,所以在生产环境中有可能磁盘已满。在这种情况下,我们需要停止日志记录,应用程序应该可以正常工作。我从网络上发现,我们需要对此类错误轮询logback StatusManager。但这将为应用程序添加一个带有logback的依赖项。 对于log4j,我发现我们可以创建一个Appender,在这种情况下停止登录。这将再次导致应用程序依赖于log4j 是否有方法仅使
是否有方法仅使用slf4j配置此功能,或者是否有其他机制来处理此功能?您可以尝试扩展slf4j.Logger类,特别是info、debug、trace和其他方法,并在每次调用之前手动查询可用空间(通过File.getUsableSpace())
这样,您就不需要任何应用程序依赖项,也不必执行或配置任何操作。Logback的设计可以很好地处理这种情况。一旦目标磁盘已满,logback的
FileAppender
将在短时间内停止写入。一旦延迟过去,它将尝试恢复。如果恢复尝试失败,等待时间将逐渐增加,最多1小时。如果恢复尝试成功,FileAppender
将再次开始记录
该过程是完全自动的,可以无缝地扩展到RollingFileAppender
。另见
就个人而言,优雅恢复是我最喜欢的logback功能之一。2实物选项:
- 在linux上添加一个cron任务(或者在windows上添加一个定时任务)来清理您的混乱(如果需要,包括gzip)李>
- 购买更大的硬盘并手动执行维护
- +-减少伐木
磁盘已满就像OOM一样,当捕获它时,您无法知道第一个失败的是什么。处理内存(或磁盘)不足的问题是通过阻止它。在很多情况下,可能需要额外的磁盘空间,但任务失败。我很好奇,当磁盘已满时,当前会发生什么?slf4j/logback是否出现异常?我原以为日志库不会向您抛出任何异常。File.getUsableSpace()需要日志文件位置,该位置会根据部署的不同而有所不同。事件会被缓冲还是发生在磁盘已满时,丢失?IO故障期间生成的事件未被缓冲。日志中是否会有日志事件已被删除的通知?我们能否在磁盘已满之前停止?