2013-08-02 1 views
10

Я использую boost 1.54.0. Ниже вы можете найти минимальный пример, который иллюстрирует мою проблему.Boost log severity_logger init_from_stream

Я использую severity_logger журнала буфера. Я хочу настроить свои раковины из потока. (В следующем примере я использую stringstream. В моем реальном приложении поток поступает из файла.) Я хочу использовать% Severity% для вывода или фильтрации.

проблема is: Если я использую его, как указано в примере ниже, % Тяжесть% пуста.

% LineID% и% Message% заполнены так, как ожидалось. Если я установил раковину, указанную в выделенных линиях, она работает так, как ожидалось.

Любые идеи?

#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/utility/setup/from_stream.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/expressions.hpp> 

enum SeverityLevel { trace, fatal }; 

int main (int argc, char *argv[]) 
{ 
    boost::log::add_common_attributes(); 
    /* 
    struct severity_tag; 
    boost::log::add_console_log(std::clog, 
     boost::log::keywords::format = (
      boost::log::expressions::stream 
       << boost::log::expressions::attr< unsigned int >("LineID") 
       << ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity") 
       << "> " << boost::log::expressions::smessage) 
    ); */ 

    std::stringstream s; 
    s << "[Sinks.MySink]" << std::endl; 
    s << "Destination=Console" << std::endl; 
    s << "Format=\"%LineID%: <%Severity%> - %Message%\"" << std::endl; 
    boost::log::init_from_stream(s); 

    boost::log::sources::severity_logger<SeverityLevel> lg; 
    BOOST_LOG_SEV(lg, trace) << "This is a trace message"; 
    BOOST_LOG_SEV(lg, fatal) << "This is a fatal message"; 
    return 0; 
} 
+0

Было бы appeat что вам нужно проинструктировать Boost Log, чтобы на самом деле использовать 'Sinks.MySink'. К сожалению, у меня нет опыта в конфигурации Boost Log – sehe

+0

Это не проблема. Он использует MySink. Предоставляемый формат I используется по мере необходимости. За исключением:% Severity% заменяется пустой строкой. Это должен быть номер значения перечисления. Он отлично работает с передовым способом конфигурации приемника. – SebastianK

ответ

10

Вы правы. Это известная ошибка и исправлена ​​в текущей версии разработки.

Вот сообщение об ошибке: https://svn.boost.org/trac/boost/ticket/8840

Чтобы сделать этот ответ менее зависимым по ссылке здесь будет так, как это было решено в рамках доклада:

Вы должны зарегистрировать серьезности атрибута в перед анализом файла настроек. См. here. Атрибут может быть зарегистрирован как для форматировщиков, так и для фильтров, если вы хотите отфильтровать записи на основе уровня серьезности.

ОК, это работает, но я должен был добавить функцию входного потока/экстракции, а затем я должен был добавить следующие две строки перед загрузкой параметров из файла настроек:

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity"); 
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
+2

Ты мужчина. Мне потребовалось 2 дня, пока я не наткнулся на ваш пост, потому что я считал, что сделал ошибку конфигурации ... – quaylar

+2

Несколько лет спустя ... Boost - это версия 1.62, и я столкнулся с той же проблемой за последние 2 дня. Благодаря этому ответу я смог заставить «Severity» работать. – Rado

 Смежные вопросы

  • Нет связанных вопросов^_^