Могу ли я скопировать приемник Boost::Log и изменить его?

В настоящее время я создаю приемник журнала, который сбрасывает строки журнала из вывода моего класса 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 и добавить к нему фильтр.

Я могу это сделать?


person quant    schedule 29.10.2016    source источник


Ответы (1)


Нет, это невозможно. Приемники не могут быть скопированы, и на самом деле приемники, созданные add_file_log, используют не text_ostream_backend, а text_file_backend; вы не можете настроить text_file_backend для вывода на std::cout.

Лучше всего либо использовать функцию, как вы это уже делали, либо кэшировать средство форматирования в formatter и установите его для обоих ваших приемников.

person Andrey Semashev    schedule 02.01.2017