boost log : 使用 formatting_ostream 来存储日志

boost log :using formatting_ostream to store log

我想准备日志消息并将其存储在某个地方。
然后将这个东西传递给函数,将 << 应用于这个东西,将它放入 BOOst_LOG 宏中。
我需要这个,因为我使用多个记录器将此日志放到多个后端。
我读到了 formatting_ostream 但所有示例都显示了 << 的重载,在此期间它需要对 formatting_ostream 的左值引用。我想知道 formatting_ostream 是在哪里创建的??。
我可以这样做吗:

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;

首先,您不需要在多个记录器中输出一条日志记录,以便在多个接收器后端对其进行处理。只要记录没有被过滤器拒绝,每条日志记录都会在所有接收器中处理,无论使用哪个记录器来生成它。如果您有意在记录器中安排过滤器和属性,以便来自一个记录器的记录仅在一个接收器中处理(例如,通过使用通道),您还可以以一种允许处理与特定接收器无关的其他记录器的记录的方式安排它们在所有水槽中。这比在不同的记录器中生成多条记录要高效得多,因为它避免了创建额外的日志记录并对其应用过滤器的开销。

现在,直接回答你的问题,传递给各种函数的 formatting_ostream 对象是由 Boost.Log 创建的。它的确切创建位置取决于所讨论的功能。例如,传递给格式化程序的流是作为接收器前端实现的一部分创建的。

您可以创建formatting_ostream,但您需要记住以下几点:

  • 您必须提供一个字符串,其中格式化输出将存储在 formatting_ostream 构造函数中。该字符串必须在流对象的整个生命周期内保持活动状态。
  • 完成格式化后,您需要显式刷新流以确保流中的所有缓冲内容都被推送到字符串中。
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::ostringstreamBoost.Format 甚至 std::snprintf.

您应该知道,像这样预先编写消息字符串可能对性能不利。如果过滤器丢弃日志记录,则根本不会评估流式表达式。但是你预先编写消息的代码总是被评估,即使日志记录之后被丢弃。