我是一名新手C ++开发人员,我正在研究一个需要经常写出日志文件的应用程序,并且我们注意到在运行应用程序时日志文件已经损坏了几次。主要方案似乎是程序关闭或崩溃时,但我担心这不是唯一可能出错的时间,因为应用程序是从一个相当“快速和肮脏”的项目中诞生的
保存最绝对最新的数据并不重要,所以有人提到的一个想法是交替写入两个日志文件,然后如果程序崩溃,至少有一个仍然具有正确的完整性。但这并不适合我,因为我还没有看到任何其他应用程序使用这种方法。
是否有任何“最佳实践”或标准“模式”或框架来处理此问题?
目前我正在考虑做这样的事情 -
然后,如果有任何失败,我可以通过删除临时回滚,原来不受影响。
答案 0 :(得分:3)
您必须找到文件损坏的原因。如果应用程序意外崩溃,则无法破坏文件。唯一可能发生的是文件被截断(即缺少最后的日志消息)。但是应用程序无法在文件中跳转并在其他地方修改内容(除非您在日志记录代码中调用seek
,这会让我感到惊讶)。
我的猜测是该应用程序是多线程的,并且正在从多个线程调用日志代码,这些线程很容易导致数据在数据被写入日志之前被损坏。
答案 1 :(得分:2)
您可能忘记每隔一段时间调用fsync()
,或者数据来自不同的线程而它们之间没有正确的同步。没有更多信息(平台,你看到的腐败形式)很难说。
解决方法是使用日志文件翻转,即。经常开始一个新文件。
答案 2 :(得分:2)
我真的认为当你开始为日志文件添加复杂性时,你(以及其他人)正在浪费你的时间。日志的重点在于它应该易于使用和实现,并且应该在大多数情况下都能正常工作。为此,只需将日志写入一个无缓冲的流(l;在C ++程序中使用ike cerr),然后根据我的经验,偶尔使用snafus。
OTOH,如果您确实需要对应用程序所做的一切进行审计跟踪,出于法律原因,那么您应该使用某种形式的事务存储,例如SQL数据库。
答案 3 :(得分:1)
不确定您的应用是否是多线程的 - 如果是这样,请考虑使用Active Object Pattern (PDF)将队列放在日志前面,并在单个线程中进行所有写入。该线程可以在后台提交日志。所有日志写入都是异步的,按顺序,但不一定立即写入。
活动对象也可以批量写入。