2009-07-17 5 views
2

私は初心者のC++開発者です。私は非常に頻繁にログファイルを書き出す必要があるアプリケーションに取り組んでおり、ログファイルが壊れていることに気付きましたアプリを実行している時間。主なシナリオは、プログラムが停止している、またはクラッシュしているように見えますが、アプリケーションがかなり「迅速で汚れた」プロジェクトから生まれたため、何かが間違っている唯一の時間ではないことに懸念しています。ファイルの破損の検出とエラー処理

最新の最新のデータを保存する必要はありません。誰かが2つのログファイルに交互に書き込みを行い、プログラムがクラッシュした場合でも、 。しかし、私は実際にこの方法を使って他のアプリケーションを見たことがないので、これは私にとって正しいにおいをしません。

この問題を処理するための「ベストプラクティス」または標準の「パターン」またはフレームワークはありますか?私はこのような何かをやってと思っています現時点では

-

  1. 書き込みデータの一時ファイルへ
  2. データをチェックは、ハッシュ
  3. で正しく書かれた元のファイルの名前を変更し、一時ファイルを置く。
  4. 何が失敗した場合、私はちょうどちょうど一時を削除することによって、ロールバックすることができ、そしてオリジナルはそのままなりその後、元

を削除します。

答えて

3

ファイルが破損する理由を確認する必要があります。アプリが突然クラッシュすると、ファイルが破損することはありません。起こりうる唯一のことは、ファイルが切り捨てられている(すなわち、最後のログメッセージが欠落している)ということです。しかし、アプリケーションは実際にファイル内を飛び越えることができず、他の場所で何かを修正することはできません(私に驚かれるロギングコードのseekを呼び出さない限り)。

私の推測では、アプリケーションがマルチスレッドで、いくつかのスレッドからログコードが呼び出されているため、データが破損しやすくなる可能性があります。のデータがログに書き込まれます。

+0

+1これはおそらく起こっていることです。 – luke

+0

+1おそらく、おそらくそうです。 – neuro

+0

はい、アプリケーションはマルチスレッドなので、問題を修正する方法を確認するために、スレッドを安全にすることから始めます。 –

2

たびたびfsync()を呼び出すことを忘れたか、データが適切に同期していない別のスレッドから送られてきたことが考えられます。より多くの情報なしで伝えるのは難しい(プラットフォーム、あなたが見る腐敗の形)。

回避策は、ログファイルのロールオーバーを使用することです。新しいファイルを毎回頻繁に開始します。

2

ログファイルに複雑さを加えるようになると、あなた(そして他の人)があなたの時間を無駄にしていると本当に思います。ログの全体的なポイントは、使用と実装が簡単でなければならず、ほとんどの時間で動作するはずです。そのためには、バッファを使わないストリーム(C++プログラムのIke cerr)にログを書き、私の経験では非常に時折、snafusで生き残ってください。

OTOHの場合、法的な理由でアプリケーションのすべての監査証跡が本当に必要な場合は、SQLデータベースなどのトランザクション記憶域を使用する必要があります。

1

アプリがマルチスレッドであるかどうかわからない場合は、Active Object Pattern (PDF)を使用して、キューをログの前に置き、すべての書き込みを1つのスレッド内にすることを検討してください。そのスレッドはバックグラウンドでログをコミットできます。すべてのログの書き込みは非同期で、順番に行われますが、必ずしもすぐに書き込まれるとは限りません。

アクティブオブジェクトはバッチ書き込みも可能です。

+0

+1 MTの問題を処理する正しい方法... – neuro

関連する問題