Журнал повышения серьезности_logger init_from_stream

Я использую буст 1.54.0. Ниже вы можете найти минимальный пример, иллюстрирующий мою проблему.

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

Моя проблема заключается в следующем: если я использую его, как показано в примере ниже, %Severity% пуст.

%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;
}

person SebastianK    schedule 02.08.2013    source источник
comment
Казалось бы, вам нужно указать Boost Log на самом деле использовать Sinks.MySink. К сожалению, у меня нет опыта настройки Boost Log.   -  person sehe    schedule 02.08.2013
comment
Это не проблема. Он использует MySink. Формат, который я предоставляю, используется по желанию. За исключением: %Severity% заменяется пустой строкой. Это должен быть номер значения перечисления. Это отлично работает с закомментированным способом конфигурации раковины.   -  person SebastianK    schedule 02.08.2013


Ответы (1)


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

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

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

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

Хорошо, это работает, но мне пришлось добавить функцию потокового ввода/извлечения, а затем мне пришлось добавить следующие две строки перед загрузкой настроек из файла настроек:

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity");
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
person nijansen    schedule 02.08.2013
comment
Ты мужчина. Мне потребовалось 2 дня, пока я не наткнулся на ваш пост, потому что я считал, что допустил ошибку конфигурации... - person quaylar; 27.09.2013
comment
Несколько лет спустя... Boost - это версия 1.62, и я столкнулся с той же проблемой за последние 2 дня. Благодаря этому ответу я смог заставить Severity работать. - person Rado; 07.12.2016