увеличить журнал: использование formatting_ostream для хранения журнала - PullRequest
0 голосов
/ 29 марта 2020

Я хочу подготовить сообщение журнала и сохранить его в чем-то.
затем передать это что-то в функцию, которая применяет << к этому чему-то, помещая его в макрос BOOst_LOG. <br>Мне это нужно, потому что я помещаю этот журнал в несколько бэкэндов, использующих несколько логгеров.
Я читал о formatting_ostream, но во всех примерах показана перегрузка <<, при этом требуется ссылка lvalue на formatting_ostream. Интересно, где создается formatting_ostream ??. <br>Могу ли я сделать это:

boost::log::formatting_ostream os << "Request #" << this->GetId() << " for " << mUrl << " has been cancelled by the user at start of execute coroutine." << std::endl;
        boost_log_function(mHTTPRequest_LoggingInstance_shared_pointer);

затем:

BOOST_LOG(*loggerChannel_cancelExecute.get()) << os;

1 Ответ

1 голос
/ 30 марта 2020

Во-первых, вам не нужно выводить запись журнала в нескольких регистраторах, чтобы обрабатывать ее в нескольких бэкэндах приемников. Пока запись не отклоняется фильтрами, каждая запись журнала обрабатывается во всех приемниках, независимо от того, какой регистратор использовался для ее создания. Если вы намеренно расположите фильтры и атрибуты в регистраторах так, чтобы записи из одного регистратора обрабатывались только в одном приемнике (например, с помощью каналов), вы также можете расположить их так, чтобы можно было обрабатывать записи из других регистраторов, не связанных с конкретными приемниками. во всех раковинах. Это гораздо эффективнее, чем создание нескольких записей в разных регистраторах, поскольку позволяет избежать дополнительных затрат на создание дополнительных записей журнала и применение к ним фильтров.

Теперь, чтобы непосредственно ответить на ваш вопрос, объект 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.

Вы должны знать, что предварительно составив строку сообщения, подобную этой может быть плохо для производительности. Если запись журнала отбрасывается фильтрами, потоковое выражение вообще не оценивается. Но ваш код, который предварительно составляет сообщение, всегда оценивается, даже если после этого запись журнала удаляется.

...