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

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

我目前正在创建一个日志接收器,它将日志行从我的 Trainer class 的输出转储到 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() 格式化程序。事实上,我拥有该功能的唯一原因是我不必重复格式化程序代码。

相反,我更愿意 "copy" 文件接收器(使用 add_file_log 在别处创建),将其输出更改为 std::cout 并向其添加过滤器。

我可以这样做吗?

不,那是做不到的。接收器无法复制,实际上 add_file_log 创建的接收器使用的不是 text_ostream_backend 而是 text_file_backend;你不能配置 text_file_backend 输出到 std::cout.

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