如何保护日志免受应用程序崩溃?
我已经创建了一个简单的记录器,它将所有重要事项记录到文本文件中。我正在使用std::ofstream
,但是存在一个问题 - 当程序因任何原因(如崩溃)未关闭文件(调用std::ofstream::close()
)时,创建的日志实际上是空的(0大小)。而且由于日志在特殊情况下(当出现问题时最有用) - 您会看到问题。如何保护日志免受应用程序崩溃?
有什么办法可以保护我的日志吗?我可以在写完每行几行并使用append后尝试关闭文件 - 但在程序崩溃时记录/关闭文件之前,这仍然无法保护我。有没有解决办法,还是我注定了?
您应该采用flush方法,它是在那里准确地解决像你面临的问题。
还有一种方法可以被认为是更安全的,但需要更多的努力来实施和测试。该方法归结为所谓的inter-process communication (IPC)。简而言之,您可以将您的记录器作为单独的记录器应用程序执行,其将通过特定的协议(接口)与目标应用程序通信。您可以自行开发此类协议或使用现有的协议(通常非常通用,即通用)。因此,如果您的目标应用程序崩溃,它不会拖动记录器应用程序,因此记录器可以安全地完成其工作。
该方法通常用于一些庞大,复杂且对安全至关重要的系统。不过,我想你的情况下,这绝对是一个矫枉过正的问题,并且在每个追加都足够绰绰有余的情况下仍然是flush()
。
在我们的商业应用程序中,我们有一个非常强大的解决方案。价格是不可移植的。
我们安装了一个向量异常处理程序。在程序退出之前(这是迄今为止最常见的崩溃),该处理程序在未处理的OS异常的情况下被调用。当它被调用时,你不能再调用C++标准库函数(甚至是C函数)。即使fflush
是不可靠的。
然而,可以调用基本的OS功能。不过要小心。为OS调用设置参数不应该使用malloc
。崩溃文件的名称在崩溃实际发生之前已经设置好了,等等。立即关闭文件,再次使用OS功能。
如果是关键任务信息,我会在每次写入时打开并关闭日志。如果日志会随着时间的推移而增长,那么您可以采用滚动日志类型的解决方案,并使用“上限”大小。 – 2013-04-28 21:20:53
@KendrickLamar但是,当我打开(追加)已经创建的文件添加一些东西,永远不会关闭它(例如崩溃)文件仍然损坏。 – NPS 2013-04-28 21:25:42
错误日志不应该是非常巨大的。这就是为什么我建议在写入之前打开文件,然后再关闭文件。是她的问题吗? – 2013-04-28 21:28:58