Boost.Log非同期シンクを使用しています(Asynchronous sink frontendを参照)。適切なシャットダウンを行うには、非同期シンクへのレコードの供給を正常に停止してフラッシュする必要があります。コアにシンクを追加したり削除したりする方法がありますが、クライアントがシンクを取得したり訪問したりする方法はありません。ドキュメントはstop_logging
方法、Boost.Logを使用しているときにすべての非同期シンクを停止する方法
void stop_logging(boost::shared_ptr<sink_t>& sink)
{
boost::shared_ptr<logging::core> core = logging::core::get();
// Remove the sink from the core, so that no records are passed to it
core->remove_sink(sink);
// Break the feeding loop
sink->stop();
// Flush all log records that may have left buffered
sink->flush();
sink.reset();
}
を持っていますが、それは特定のsink_t
型を取ります。 asynchronous_sinkフロントエンドクラスには、シンクのバックエンドとキューイング戦略のテンプレート引数があります。
template<typename SinkBackendT,
typename QueueingStrategyT = unbounded_fifo_queue>
class asynchronous_sink;
私はシンクのいくつかの異なる種類がありますので、私はそれらを保持している汎用コンテナを持っていると思いますので、私はそれ以上の単純な反復処理をすることができますし、コンテナ内の各シンク用stop_logging
を呼び出します。
これは、Boost.Logで提供されているインタフェースのために、私が対処しなければならないC++のテンプレートデータ構造に関する実際の質問です。私がBoost.Logコアに追加した非同期シンクを追跡するのに使う良いデータ構造は何ですか?私はシャットダウン時にstop_logging
と呼ぶことができるので、私は1つ必要です。
私の最初の簡単なアプローチは、boost::any
オブジェクトのベクトルを持つことです。しかし、それはむしろ面倒で面倒なことです。私は合理的なアプローチは、stop_logging
を呼び出すラムダメソッドである関数オブジェクトのベクトルを持つことになると考えています。しかし、私はテンプレートの種類で失われ、これを行う方法を知らない。
何か助けていただきありがとうございます。 ありがとう!