文件损坏检测和错误处理 我是一个新手C++开发人员,我正在编写一个应用程序,它需要经常写一个日志文件,我们注意到运行应用程序时日志文件已经损坏了几次。主要的场景似乎是当程序关闭或崩溃时,但我担心这不是唯一一次出现问题,因为应用程序诞生于一个相当“快速且肮脏”的项目

文件损坏检测和错误处理 我是一个新手C++开发人员,我正在编写一个应用程序,它需要经常写一个日志文件,我们注意到运行应用程序时日志文件已经损坏了几次。主要的场景似乎是当程序关闭或崩溃时,但我担心这不是唯一一次出现问题,因为应用程序诞生于一个相当“快速且肮脏”的项目,c++,file-io,C++,File Io,保存最绝对的最新数据并不重要,因此有人提到的一个想法是交替写入两个日志文件,如果程序崩溃,至少有一个仍然具有适当的完整性。但我觉得这并不合适,因为我还没有看到任何其他应用程序使用这种方法 是否有任何“最佳实践”或标准“模式”或框架来处理此问题 目前我正在考虑做这样的事情- 将数据写入临时文件 检查是否使用哈希正确写入数据 重命名原始文件,并将临时文件放置到位 删除原件 然后,如果有任何失败,我可以通过删除临时文件回滚,原始文件将保持不变 您可能忘记了每隔一段时间调用fsync(),或者数据来自不

保存最绝对的最新数据并不重要,因此有人提到的一个想法是交替写入两个日志文件,如果程序崩溃,至少有一个仍然具有适当的完整性。但我觉得这并不合适,因为我还没有看到任何其他应用程序使用这种方法

是否有任何“最佳实践”或标准“模式”或框架来处理此问题

目前我正在考虑做这样的事情-

  • 将数据写入临时文件
  • 检查是否使用哈希正确写入数据
  • 重命名原始文件,并将临时文件放置到位
  • 删除原件

  • 然后,如果有任何失败,我可以通过删除临时文件回滚,原始文件将保持不变

    您可能忘记了每隔一段时间调用
    fsync()
    ,或者数据来自不同的线程,但它们之间没有适当的同步。如果没有更多的信息(平台,你看到的腐败形式),很难说

    一种解决方法是使用日志文件滚动,即每隔一段时间启动一个新文件。

    我真的认为,当您开始增加日志文件的复杂性时,您(和其他人)是在浪费时间。日志的全部要点是,它应该易于使用和实现,并且应该在大部分时间都能正常工作。为此,只需将日志写入未缓冲流(L;iCeCERP在C++程序中),并与我的经验中的任何偶然事件一起生存,SNAFUS。
    OTOH,如果出于法律原因,您确实需要对应用程序所做的一切进行审计跟踪,那么您应该使用某种形式的事务存储,例如SQL数据库

    您必须找到文件损坏的原因。如果应用程序意外崩溃,则无法损坏文件。唯一可能发生的情况是文件被截断(即,最后的日志消息丢失)。但该应用程序无法在文件中跳转并在其他地方修改某些内容(除非您在日志代码中调用
    seek
    ,这会让我感到惊讶)


    我猜想,应用程序是多线程的,日志记录代码是从几个线程调用的,在数据写入日志之前,这些代码很容易导致数据损坏。

    < P>不确定应用程序是否是多线程的——如果是这样,请考虑使用队列在日志前面放置并在一个线程中进行所有写入。该线程可以在后台提交日志。所有日志的写入都将是异步的,并按顺序进行,但不一定立即写入


    活动对象也可以进行批写入。

    是的,应用程序是多线程的,因此我从使日志线程安全开始,看看这在多大程度上解决了问题