我正在使用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
類型。前端類具有用於接收器後端和排隊策略的模板參數。
template<typename SinkBackendT,
typename QueueingStrategyT = unbounded_fifo_queue>
class asynchronous_sink;
我都會有幾種不同類型的匯,所以我想有持有它們的通用容器,這樣我就可以簡單的疊代,並呼籲stop_logging
每個沉在容器中。
這實際上是一個關於C++模板化數據結構的常見問題,由於Boost.Log提供的接口,我需要解決這些問題。什麼是一個好的數據結構來跟蹤我添加到Boost.Log內核的異步接收器?我需要一個,所以我可以在關機時致電stop_logging
。
我的第一個簡單的方法是有一個向量boost::any
對象。但是這很麻煩,不雅。我懷疑一個合理的方法是使用lambda方法調用stop_logging
的函數對象的向量。但是我迷失在模板類型中,不知道如何去做。
我很感激任何幫助。 謝謝!