【发布时间】:2020-04-20 15:28:27
【问题描述】:
我使用 boost v1.60 并尝试编写一个函数来初始化和配置 boost::log,但我遇到了一个我无法解释的奇怪行为。我调用以下函数。
更新:我忘了提到我的记录器是在 DLL 中定义的,并且我尝试通过 DLL API 推送格式化程序。如果从 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 个 lambda,如下所示:
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; }
);
问题在于 formater lambda。如果我使用以下代码在命令行输出上触发一些日志行,它会因断言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;
【问题讨论】:
-
能否添加回溯以显示触发断言的位置?