我的应用程序遇到了一个磁盘已满错误,不知怎么的,由于磁盘已满,抛出了一个未处理的异常,导致调用set_terminate()
处理程序。
正常情况下,我会在我的日志文件中得到某种堆栈跟踪,这样我就可以看到出了什么问题,然而,在这种情况下,由于磁盘已满,没有记录堆栈跟踪,并且不清楚程序是否由于缺乏磁盘空间而终止。
读取我可以从最后写入磁盘的内容中读取的内容,似乎正在写入std::clog
,它已设置为进入磁盘(已满的磁盘)。
我想知道使用operator<<
写入clog
是否会导致抛出异常,如果是这样,可能会抛出什么异常?
此外,我对如何改进我的应用程序的想法很感兴趣,以便在将来再次出现这种情况时,我可以更新我的应用程序,以便更好地跟踪到底是什么出了问题,以便我可以知道磁盘已满,而不是应用程序的其他缺点。
然而,关键问题是检测故障,否则,如何减轻的想法是没有用的。
在Linux中,您可以使用文件名[在一个特殊的目录?]来创建你在哪里的踪迹-因为文件只使用"i节点空间",通常有很多。
另一个选项是创建一个大(ish)文件作为"紧急日志存储"—如果磁盘已满,则打开紧急日志存储,并写入该文件。将其设置为几兆字节,在现代磁盘上没有人会注意到,但它为您提供了足够的空间来转储您所在位置的上下文。
我不知道代码本身会发生什么,但我想解决如何处理这种异常的问题。
本质上,在这种问题上,更多的日志记录将是有用的。但是,您必须考虑日志记录机制是否存在问题。您可能需要一个不依赖磁盘的备用日志/报告系统。
你可以继续添加冗余层,但在我看来,一个在特殊情况下失败的主服务器,加上一个在更多异常情况下失败的备份,对大多数应用程序来说已经足够好了。如果数据弹性是最重要的,那么你当然会监控你的资源并在应用程序处理时减轻(发出操作员警告或任何你选择的后备机制-例如备份假脱机空间等)。
一般来说,all ways up
与nearly always up
的成本在开发成本和时间上也遵循80/20规则。