Я использую boost v1.60 и пытаюсь написать функцию для инициализации и настройки boost :: log, но у меня встречается странное поведение, которое я не могу объяснить. Я вызываю следующую функцию.
ОБНОВЛЕНИЕ: я забыл упомянуть, что мой регистратор определен в DLL и что я пытаюсь создать sh формирователь через 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);
}
И я пытаюсь набрать sh 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; }
);
Проблема в том, с форматером лямбда. Если я использую следующий код для запуска какой-либо строки журнала на выходе командной строки, произойдет сбой с утверждением log/utility/value_ref.hpp, line 150
. На самом деле я могу запустить и распечатать все EventLevel
или все message
, но не две вещи одновременно!
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;