Я использую Boost 1.54.0.
Ниже вы можете найти минимальный пример, который иллюстрирует мою проблему.
Я использую severity_logger журнала буста.
Я хочу настроить мои приемники из потока.
(В следующем примере я использую поток строк.
В моем реальном приложении поток идет из файла.)
Я хочу использовать% 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;
}
Вы правы. Это известная ошибка, исправленная в текущей версии разработки.
Вот отчет об ошибке: https://svn.boost.org/trac/boost/ticket/8840
Чтобы сделать этот ответ менее зависимым от ссылки, вот способ, которым он был решен в отчете:
Вам нужно зарегистрировать свой атрибут серьезности в библиотеке перед анализом файла настроек. Увидеть Вот. Атрибут, возможно, придется зарегистрировать как для анализатора форматирования, так и для анализатора фильтра, если вы хотите фильтровать записи на основе уровня серьезности.
Хорошо, это работает, но мне пришлось добавить функцию ввода / вывода потока, а затем мне пришлось добавить следующие две строки перед загрузкой настроек из файла настроек:
logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity");
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity");
Других решений пока нет …