我已经创建了一个简单的记录器,它可以将重要的一切记录到文本文件中。我正在使用std::ofstream
但是有一个问题 - 当程序因任何原因(如崩溃)没有关闭文件(调用std::ofstream::close()
)时,创建的日志实际上是空的(0大小)。而且由于日志在特殊情况下(当出现问题时)非常有用 - 您会看到问题。
有没有办法保护我的日志?我可以尝试在写完每一行并使用append后关闭文件 - 但是当程序在日志记录/关闭文件之前崩溃时,这仍然无法保护我免受此情况的影响。有没有解决方案,或者我只是注定了吗?
答案 0 :(得分:3)
您应该使用 flush 方法,它可以精确地解决您所面临的问题。
还有另一种方法可以被认为更安全,但需要付出更多努力来实施和测试。该方法归结为所谓的 inter-process communication (IPC) 。简而言之,您可以将记录器实现为单独的记录器应用程序,它将通过特定的协议(接口)与目标应用程序进行通信。您可以自己开发此类协议,也可以使用现有的协议(通常非常通用,即通用)。因此,如果您的目标应用程序崩溃,它不会随之拖动记录器应用程序,因此记录器可以安全地完成其工作。
这种方法通常被一些庞大,复杂且安全关键的系统所使用。但是,我想在你的情况下,这绝对是一种过度杀伤,并且在每次追加之后都是flush()
。
答案 1 :(得分:1)
在我们的商业应用中,我们有一个非常强大的解决方案。价格是不可携带的。
我们安装了一个向量异常处理程序。在程序退出之前,在处理未处理的OS异常的情况下调用此处理程序(这是迄今为止最常见的崩溃)。当它被调用时,你不能再调用C ++标准库函数(甚至是C函数)。即使fflush
也不可靠。
然而,调用基本的OS功能是可以的。但要小心。设置OS调用的参数也不应使用malloc
。在崩溃实际发生之前已经设置了崩溃文件的名称等。请使用操作系统功能立即关闭文件。