Я использую boost v1.60 и пытаюсь написать функцию для инициализации и настройки boost::log, но сталкиваюсь со странным поведением, которое не могу объяснить. Я вызываю следующую функцию.
ОБНОВЛЕНИЕ: я забыл упомянуть, что мой регистратор определен в DLL и что я пытаюсь протолкнуть средство форматирования через API DLL. Сам форматер отлично работает, если его определить и установить изнутри DLL.
using formater_cb_t = boost::function<void(boost::log::record_view const&, boost::log::formatting_ostream& strm)>;
using filter_cb_t = boost::function<bool(const boost::log::attribute_value_set&)>;
void AddCustomConsoleLogging(const formater_cb_t& formater_func, const filter_cb_t& filter_func) {
auto pSink = boost::log::add_console_log(std::cout);
pSink->set_formatter(formater_func);
pSink->set_filter(filter_func);
}
И я пытаюсь нажать 2 лямбды, как показано ниже:
void AddCustomConsoleLogging(
[](boost::log::record_view const& rcrd, boost::log::formatting_ostream& strm)-> void {
namespace blog = boost::log;
auto attr_set = rcrd.attribute_values();
if (rcrd[boost::log::expressions::smessage]) {
strm = *rcrd[boost::log::expressions::smessage] << ",";
}
if (attr_set["EventLevel"]) {
strm << level_to_string(attr_set["EventLevel"].extract<Framework::EventLevel>().get());
strm << ",";
}
},
[](const boost::log::attribute_value_set& attr_set)->bool {return true; }
);
Проблема связана с лямбдой former. Если я использую следующий код для запуска некоторой строки журнала в выводе командной строки, это приведет к ошибке с утверждением log/utility/value_ref.hpp, line 150
. На самом деле я могу запустить и распечатать все EventLevel
или все message
, но не 2 вещи одновременно!
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(LoggerImpl, boost::log::sources::severity_logger_mt<EventLevel>)
const std::string buf = "test message !";
BOOST_LOG_SEV(LoggerImpl::get(), TRACE) << message;