0

POCO C++ ライブラリを使用した独自のログ ソリューションを探しています。

私たちのデザインと私たちが直面している問題について説明しようと思います。

新しい接続ごとに新しい環境 (新しいオブジェクトのセット) を生成する TCPServerConnectionFactory があります。生成された環境は新しいソケットを取得し、リッスン スレッドを持ちます。確立された接続にメッセージが着信すると、pthread がメッセージを処理します。受信する有用な各メッセージには、接続を閉じてこの接続用に作成されたオブジェクトのセットを破棄することによってこのプロセスが完了するまでに発生するすべてのアクションを識別する識別子が含まれます。

多くの接続が同時に発生する場合があります。pthread 環境に移行する前は、Thread::setName を %T 識別子と共に使用して、どのログ メッセージがどの接続から来ているかを明確に確認できました。マルチスレッドになった今、新しいソリューションが必要です。

接続の存続期間中に生成される各オブジェクトに一意の識別子を認識させるためのクリーンな方法を見つけることができませんでした。グローバルは新しいトランザクションによって上書きされます。新しいオブジェクトごとに ID を渡すのは面倒です。

次に試みたのは、POCO Logger チャネル フレームワークを使用して、各接続のログを、メッセージで受信する一意の識別子で名前を付けた新しいファイルに保存することでした。ここでの問題は、別の接続中に新しい接続が発生した場合、チャネル プロパティが上書きされ、ログが別のファイルを指すようになることです。

Logger フレームワークを使用して、接続ごとに新しい Logger 階層を作成する方法はありますか? 基本的に、新しい接続によって生成された一連のオブジェクトがすべて同じログ プロパティを使用し、他のオブジェクト ログ プロパティのセットに影響を与えないようにする必要があります。

接続の存続期間中に作成されたすべてのオブジェクト間で識別子を共有する適切な方法に関する洞察も同様に役立ちます。

ありがとう!

4

1 に答える 1

0

少量の情報を保存する場合は、デッドロック/ライブロックの問題を回避するために、 aおよび aとともにsingletonyour のインスタンスを使用します。ただし、多数の接続が予想される場合は、ミューテックスをブロックすると速度が低下するため、接続ごとに 1 つのロガー インスタンスを使用することを検討する必要があります。loggermutexsemaphore

デッドロック保護が組み込まれているため、singleton使用を検討する場合に備えて。std::mutex

于 2013-08-14T19:36:12.520 に答える