Во-первых, вам не нужно выводить запись журнала в нескольких регистраторах, чтобы обрабатывать ее в нескольких бэкэндах приемников. Пока запись не отклоняется фильтрами, каждая запись журнала обрабатывается во всех приемниках, независимо от того, какой регистратор использовался для ее создания. Если вы намеренно расположите фильтры и атрибуты в регистраторах так, чтобы записи из одного регистратора обрабатывались только в одном приемнике (например, с помощью каналов), вы также можете расположить их так, чтобы можно было обрабатывать записи из других регистраторов, не связанных с конкретными приемниками. во всех раковинах. Это гораздо эффективнее, чем создание нескольких записей в разных регистраторах, поскольку позволяет избежать дополнительных затрат на создание дополнительных записей журнала и применение к ним фильтров.
Теперь, чтобы непосредственно ответить на ваш вопрос, объект formatting_ostream
, который передается в Boost.Log создает различные функции. Точно, где это создано, зависит от рассматриваемой функции. Например, поток, который передается в средства форматирования, создается как часть реализации внешнего интерфейса приемника.
Вы можете создать formatting_ostream
, но вам необходимо запомнить следующее:
- Вы должны указать строку, в которой форматированный вывод будет сохранен в конструкторе
formatting_ostream
. Эта строка должна оставаться в живых в течение всего времени жизни объекта потока. - После того, как вы закончите с форматированием, вам нужно явно обработать поток sh потока, чтобы гарантировать, что любое буферизованное содержимое в потоке выталкивается в строка.
std::string str;
boost::log::formatting_ostream strm(str);
strm << "Request #" << this->GetId() << " for " << mUrl
<< " has been cancelled by the user at start of execute coroutine.";
strm.flush();
BOOST_LOG(*loggerChannel_cancelExecute.get()) << str;
Однако вам не обязательно использовать formatting_ostream
в первую очередь. Вы можете составить строку любым способом, включая std::ostringstream
, Boost.Format или даже std::snprintf
.
Вы должны знать, что предварительно составив строку сообщения, подобную этой может быть плохо для производительности. Если запись журнала отбрасывается фильтрами, потоковое выражение вообще не оценивается. Но ваш код, который предварительно составляет сообщение, всегда оценивается, даже если после этого запись журнала удаляется.