如何保护日志免受应用程序崩溃?

时间:2013-04-28 21:16:52

标签: c++ logging crash fstream

我已经创建了一个简单的记录器,它可以将重要的一切记录到文本文件中。我正在使用std::ofstream但是有一个问题 - 当程序因任何原因(如崩溃)没有关闭文件(调用std::ofstream::close())时,创建的日志实际上是空的(0大小)。而且由于日志在特殊情况下(当出现问题时)非常有用 - 您会看到问题。

有没有办法保护我的日志?我可以尝试在写完每一行并使用append后关闭文件 - 但是当程序在日志记录/关闭文件之前崩溃时,这仍然无法保护我免受此情况的影响。有没有解决方案,或者我只是注定了吗?

2 个答案:

答案 0 :(得分:3)

您应该使用 flush 方法,它可以精确地解决您所面临的问题。

还有另一种方法可以被认为更安全,但需要付出更多努力来实施和测试。该方法归结为所谓的 inter-process communication (IPC) 。简而言之,您可以将记录器实现为单独的记录器应用程序,它将通过特定的协议(接口)与目标应用程序进行通信。您可以自己开发此类协议,也可以使用现有的协议(通常非常通用,即通用)。因此,如果您的目标应用程序崩溃,它不会随之拖动记录器应用程序,因此记录器可以安全地完成其工作。

这种方法通常被一些庞大,复杂且安全关键的系统所使用。但是,我想在你的情况下,这绝对是一种过度杀伤,并且在每次追加之后都是flush()

答案 1 :(得分:1)

在我们的商业应用中,我们有一个非常强大的解决方案。价格是不可携带的。

我们安装了一个向量异常处理程序。在程序退出之前,在处理未处理的OS异常的情况下调用此处理程序(这是迄今为止最常见的崩溃)。当它被调用时,你不能再调用C ++标准库函数(甚至是C函数)。即使fflush也不可靠。

然而,调用基本的OS功能是可以的。但要小心。设置OS调用的参数也不应使用malloc。在崩溃实际发生之前已经设置了崩溃文件的名称等。请使用操作系统功能立即关闭文件。