1

Windows の C++ でスレッドセーフ ロギング メカニズムを実装する必要があり、ストリーム ライブラリを使用したいと考えています。

これを行うことに関して誰かが私にアドバイスをくれるかどうか知りたかったのですが、何が最善の方法でしょうか?

ログメッセージは毎回数行の長さになる可能性が高いので、最初にそれらをバッファに書き込んでからファイルにフラッシュする必要があるでしょうか?

このロギングはかなり高速で、使用時にアプリケーションのパフォーマンスにあまり影響を与えないはずなので、ファイルへの実際の書き込みは独自のスレッドで行うことを考えていました。それは良い考えですか?

アドバイスやヒントをいただければ幸いです。

4

4 に答える 4

4

独自に作成するのではなく、既存のものを使用してみませんか。

パンテイオス

ブースト

于 2010-09-07T09:55:17.477 に答える
2

はい-最初に一時的なstd::ostringstreamオブジェクトに書き込み、次にそれをログofstreamにフラッシュします。ロックを長く保持しすぎるのを避けるだけでなく、異なるスレッドからのストリームマニピュレーターが相互に影響を与えないようにし、個々の呼び出しがoperator<<ログに出力を散在させないようにするためです。一時的なostringstreamを使用すると、完全で意味のある複数行のメッセージを処理し、それらが1つの部分に記述されていることを確認できます。

あなたがそれをプロファイリングしてそれが問題であるかどうか見るまで、私は専用のスレッドを気にしません。シンプルがいいです。

(一般的なパフォーマンスの間違い:ログレベルでメッセージのログ記録が必要かどうかを判断する前に、ログメッセージをオブジェクトにストリーミングします。これを回避するには、プリプロセッサマクロを使用してifをストリーミングにラップします。)

于 2010-09-07T10:00:14.227 に答える
0

フレームワークをチェックするためのMitchのアドバイスの次に:
バッファーへのストリーミングとスレッドへのバッファーの送信は現実的なアプローチです。(重大度レベルに基づいて)条件付きロギングを行う場合、マクロは不要なときにストリーミングを回避するのに役立ちます(メタデータ:ファイル、行、関数にも役立ちます)。
これらを別のスレッドに記録すると、クラッシュ時に重要なログが失われることに注意してください。

于 2010-09-07T10:01:34.127 に答える
0

1 つのオプションは、ロギング コードを別のアプリまたは非表示のウィンドウを持つスレッドに配置し、PostMessage を使用してロギング データを送信することです。

于 2010-09-07T10:10:05.080 に答える