我想准备日志信息并把它存储在什么东西里。
然后把这个东西传递给函数,它将<<应用到这个东西中,把它放到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;发布于 2020-03-30 10:58:03
首先,不需要在多个记录器中输出日志记录,以便在多个接收器后端处理日志记录。只要筛选器不拒绝该记录,则所有接收器中的每个日志记录都会被处理,而不管使用哪个记录器来生成它。如果有意在记录器中安排筛选器和属性,以便仅在一个接收器中处理来自一个记录器的记录(例如,通过使用通道),则还可以在所有接收器中处理来自与特定接收器无关的其他记录器的记录。这比在不同的记录器中生成多个记录要高效得多,因为它避免了创建额外日志记录和对其应用筛选器的开销。
现在,为了直接回答您的问题,传递给各种函数的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::ostringstream、Boost.Format甚至std::snprintf。
不过,您应该知道,像这样预先组合消息字符串可能不利于性能。如果筛选器丢弃日志记录,则根本不计算流表达式。但是,即使日志记录随后被丢弃,也始终会对预组合消息的代码进行评估。
https://stackoverflow.com/questions/60916808
复制相似问题