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

How to protect log from application crash?

本文关键字:应用程序 崩溃 日志 何保护 保护      更新时间:2023-10-16

我创建了一个简单的记录器,它将所有重要的内容记录到一个文本文件中。我正在使用std::ofstream,但有一个问题-当程序不关闭文件(调用std::ofstream::close()),无论什么原因(如崩溃),创建的日志实际上是空的(0大小)。由于日志在特殊情况下(当出现问题时)最有用,因此您可以看到问题所在。

有没有办法保护我的日志不受影响?我可以尝试在每写几行之后关闭文件,并使用追加-但这仍然不能保护我免受程序在记录过程中崩溃的情况/在关闭文件之前。有解决办法吗,还是我注定要失败?

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

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

这种方法通常用于一些大型、复杂和安全关键的系统。然而,我猜在你的情况下,这绝对是一个过度的和裸flush()后每个追加是绰绰有余。

在我们的商业应用程序中,我们对此有一个非常健壮的解决方案。代价是不能携带。

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

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