首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost日志:使用formatting_ostream存储日志

boost日志:使用formatting_ostream存储日志
EN

Stack Overflow用户
提问于 2020-03-29 15:49:57
回答 1查看 175关注 0票数 0

我想准备日志信息并把它存储在什么东西里。

然后把这个东西传递给函数,它将<<应用到这个东西中,把它放到BOOst_LOG宏中。

我需要这个,因为我使用几个记录器将这个日志放到了几个后端。

我读过关于formatting_ostream的文章,但是所有的例子都显示了<<的重载,在此过程中,它引用了formatting_ostream的值。我想知道formatting_ostream是在哪里创建的?

我可以这么做吗?

代码语言:javascript
复制
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);

然后:

代码语言:javascript
复制
BOOST_LOG(*loggerChannel_cancelExecute.get()) << os;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 10:58:03

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

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

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

  • 您必须提供一个字符串,其中格式化的输出将存储在formatting_ostream构造函数中。该字符串必须在流对象的整个生命周期内保持活动。
  • 完成格式化之后,需要显式地刷新流,以确保流中的任何缓冲内容都被推送到字符串中。
代码语言:javascript
复制
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

不过,您应该知道,像这样预先组合消息字符串可能不利于性能。如果筛选器丢弃日志记录,则根本不计算流表达式。但是,即使日志记录随后被丢弃,也始终会对预组合消息的代码进行评估。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60916808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档