【发布时间】:2016-11-29 16:22:32
【问题描述】:
我曾经在我的一个名为 libfoo 并由 Win32 控制台应用程序 exefoo 使用的 DLL 中格式化 boost::log 的输出。代码是
// #include various boost log headers
void __declspec(dllexport) add_boost_log_console_sink()
{
boost::log::add_common_attributes();
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(boost::shared_ptr<std::ostream>(&std::cout, boost::null_deleter()));
sink->set_formatter(xspectra::get_our_formatter(false));
sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::info
&&
boost::log::expressions::has_attr(tag_attr) == false);
boost::log::core::get()->add_sink(sink);
}
boost::log::formatter __declspec(dllexport) get_our_formatter(bool bSubSeconds)
{
std::string sTimeStamp("%H:%M:%S");
if (bSubSeconds)
sTimeStamp += ".%f";
return boost::log::expressions::stream
//<< std::hex //To print the LineID in Hexadecimal format
<< std::setw(6) << std::setfill('0')
<< line_id
<< "\t"
<< boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", sTimeStamp)
<< " <" << boost::log::trivial::severity
<< "> \t"
/*
<< boost::log::expressions::if_(boost::log::expressions::has_attr(tag_attr))
[
boost::log::expressions::stream << "[" << tag_attr << "]\t" TAGS SUSPENDED
]
*/
<< boost::log::expressions::smessage;
}
在 libfoo 的主要暴露对象中,我在 exefoo 的 main() 中调用了 -once- add_boost_log_console_sink(); 相同的调用。
每个后续的 BOOST_LOG_TRIVIAL(severity) 调用 inside libfoo 都会生成格式化输出,而 exefoo 内部的每个类似调用都不会。
出于代码模块化的目的,我将这些函数移入了一个新的 DLL,liblog,供 libfoo 和 exefoo 使用。现在每个日志都没有格式化。
似乎以某种方式从 DLL 加载此代码不会产生任何效果;我希望它会这样做。
【问题讨论】:
-
您是否与 Boost.Log 动态链接(即 dll)?你定义
BOOST_LOG_DYN_LINK还是BOOST_ALL_DYN_LINK? -
我没有,我正在静态链接
libboost_log-vc140-mt-1_60.lib。但是 liblog 和 libfoo 是 dll。也许我应该至少将 liblog 更改为静态库。 -
这就是问题的根源。如果从不同的模块中使用,Boost.Log 需要构建为共享库。 boost.org/doc/libs/1_62_0/libs/log/doc/html/log/installation/…
标签: c++ logging boost dll boost-log