2013-09-30 3 views
1

Я использую Boost.Log, который является частью Boost v1.54. У меня есть приемник, который я хочу принимать только сообщения журнала из текущего потока. Как я могу это достичь?Boost.Log: как фильтровать по текущей теме id

BOOST_LOG_ATTRIBUTE_KEYWORD(thread_id, "ThreadID", logging::attributes::current_thread_id::value_type) 
std::stringstream stream; 
logging::add_common_attributes(); 

boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>(); 
sink->locked_backend()->add_stream(stream); 
logging::core::get()->add_sink(sink); 

boost::thread::id currentThreadId = boost::this_thread::get_id(); 

// At this line compiler complains about the '==' operator. 
sink->set_filter(thread_id == currentThreadId); 

Без последней строки все работает нормально, и когда я настраиваю форматер раковины, он выводит идентификатор вызывающего потока. Каков правильный способ сравнить атрибут thread_id с currentThreadId? Я знаю, что могу использовать какой-то пользовательский атрибут для тегов сообщений с текущим идентификатором потока, а затем отфильтровать их по этому атрибуту, но как насчет атрибута current_thread_id по умолчанию boost? Используется ли для этой цели?

ответ

1

Хорошо, проведя половину ночи, копаясь вокруг, я наткнулся на пространство имен (недокументированное?) boost::log::aux, где я нашел функцию boost::log::aux::this_thread::get_id(). Он возвращает объект соответствующего типа, который я теперь могу сравнить с ключевым словом thread_id. Теперь интересно, если пространство имен boost::log::aux предназначено только для внутреннего внутреннего использования? Некоторое время назад я использовал некоторые внутренние функции ускоренных мьютексов/блокировок, а после следующего обновления библиотеки они все изменили, и я даже не смог скомпилировать свой код с этой новой версией библиотеки. Так что теперь я не хочу повторять свои прошлые ошибки :)

Смежные вопросы