【问题标题】:boost log :using formatting_ostream to store logboost log:使用formatting_ostream存储日志
【发布时间】:2020-03-29 15:49:57
【问题描述】:

我想准备日志消息并将其存储在某些东西中。
然后将这个东西传递给函数,它将 我需要这个,因为我使用多个记录器将此日志放到多个后端。
我阅读了有关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;

【问题讨论】:

    标签: boost-log


    【解决方案1】:

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

    现在,为了直接回答您的问题,传递给各种函数的 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

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

    【讨论】:

    • 我应该在formatting_ostream上使用方法clear来为下一个进程做准备???多线程有什么问题吗??我应该通过指针或引用或值将流传递给函数吗??
    • 我尝试传递流,但它给了我分配器无法访问的错误。在我的代码中,流是类 Request 的公共成员,它被发送到免费函数 boost_log_function。所以我尝试传递 @987654329 @ 但它仍然给出错误。我认为这与通过班级成员的规则有关?对吧?
    • 对不起,我不知道你在做什么,出了什么问题。如果您还有其他问题,可以将它们作为单独的问题发布在 StackOverflow 上。但请提供一个最小的可编译代码示例以及您的问题。
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2023-04-07
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多