我可以复制一个Boost::Log接收器并更改它吗?

Can I copy a Boost::Log sink and change it?

本文关键字:接收器 Log 我可以 Boost 一个 复制      更新时间:2023-10-16

我目前正在创建一个日志接收器,从我的Trainer类的输出转储日志行到cout:

    using namespace boost;                                                      
    using namespace log;                                                        
    using namespace expressions;                                                
    using namespace sinks;                                                      
    auto sink = make_shared<synchronous_sink<text_ostream_backend>>();          
    sink->set_formatter(Utility::GetLoggingFormat());                           
    sink->locked_backend()->add_stream(                                         
        shared_ptr<std::ostream>(&std::cout, null_deleter()));                  
    sink->set_filter((                                                          
        has_attr(Utility::ClassTag) &&                                          
        Utility::ClassTag == "App::Trainer"));                                  
    boost::log::core::get()->add_sink(sink);                                    

然而,我已经添加了一个接收器(通过在其他地方调用add_file_log),将所有日志行转储到一个文件。它使用相同的GetLoggingFormat()格式化程序。实际上,我使用该函数的唯一原因是我不必重复格式化程序代码。

相反,我更喜欢只是"复制"文件接收器(在其他地方使用add_file_log创建),将其输出更改为std::cout并添加过滤器。

我可以这样做吗?

不行。sink不能被复制,事实上add_file_log创建的sink使用的不是text_ostream_backend,而是text_file_backend;

不能配置text_file_backend输出到std::cout

最好的方法是使用函数,就像你已经做的那样,或者将格式化器缓存在formatter对象中,并将其设置为两个接收器。