I’m a newbie C++ developer and I’m working on an application which needs to write out a log file every so often, and we’ve noticed that the log file has been corrupted a few times when running the app. The main scenarios seems to be when the program is shutting down, or crashes, but I’m concerned that this isn’t the only time that something may go wrong, as the application was born out of a fairly “quick and dirty” project.
It’s not critical to have to the most absolute up-to-date data saved, so one idea that someone mentioned was to alternatively write to two log files, and then if the program crashes at least one will still have proper integrity. But this doesn’t smell right to me as I haven’t really seen any other application use this method.
Are there any “best practises” or standard “patterns” or frameworks to deal with this problem?
At the moment I’m thinking of doing something like this –
- Write data to a temp file
- Check the data was written correctly with a hash
- Rename the original file, and put the temp file in place.
- Delete the original
Then if anything fails I can just roll back by just deleting the temp, and the original be untouched.
You must find the reason why the file gets corrupted. If the app crashes unexpectedly, it can’t corrupt the file. The only thing that can happen is that the file is truncated (i.e. the last log messages are missing). But the app can’t really jump around in the file and modify something elsewhere (unless you call
seekin the logging code which would surprise me).My guess is that the app is multi threaded and the logging code is being called from several threads which can easily lead to data corrupted before the data is written to the log.