Во-первых, атрибут TimeStamp
отсутствует в выводе, потому что вы не добавили его в ядро ведения журнала.Вы можете добавить его, как описано здесь :
boost::log::core::get()->add_global_attribute(
"TimeStamp",
boost::log::attributes::local_clock());
Или вы можете добавить его в качестве одного из часто используемых атрибутов, вызвав add_common_attributes
.
Далее присутствует атрибут Severity
, предоставленный регистратором.Однако тип значения этого атрибута (boost::log::trivial::severity_level
) по умолчанию не поддерживается для фильтров и форматеров, проанализированных из строк.Это можно решить двумя способами.
Во-первых, вы можете переключиться на ручную настройку приемников журналирования, что позволит вам установить фильтр и форматер для приемника в качестве лямбда-выражения.Таким образом, вы сможете указать тип атрибута для средства форматирования.Например:
BOOST_LOG_ATTRIBUTE_KEYWORD(a_timestamp, "TimeStamp", boost::log::attributes::local_clock::value_type)
BOOST_LOG_ATTRIBUTE_KEYWORD(a_severity, "Severity", boost::log::trivial::severity_level)
BOOST_LOG_ATTRIBUTE_KEYWORD(a_file, "File", std::string)
BOOST_LOG_ATTRIBUTE_KEYWORD(a_line, "Line", int)
typedef boost::log::sinks::synchronous_sink< boost::log::sinks::text_ostream_backend > sink_t;
auto sink = boost::make_shared< sink_t >();
sink->set_formatter(boost::log::expressions::ostream
<< "[" << a_timestamp << "] "
<< "[" << a_severity << "] "
<< "[" << a_file << "(" << a_line << ")] "
<< boost::log::expressions::message);
boost::log::core::get()->add_sink(sink);
Кроме того, вы можете зарегистрировать фабрики форматирования и фильтра для атрибута Severity
, чтобы синтаксические анализаторы форматирования и фильтра могли связать этот атрибут с типом boost::log::trivial::severity_level
.Это подробно описано здесь .В вашем случае вы можете просто добавить этот вызов до того, как будет проанализирован любой форматтер (т.е. перед вызовом add_console_log
):
boost::log::register_simple_formatter_factory<
boost::log::trivial::severity_level, char >("Severity");