我曾经在我的DLL中格式化boost::log
的输出,名为 libfoo ,并由Win32控制台应用程序 exefoo 使用。代码是
// #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 的add_boost_log_console_sink();
内调用了-once- main()
。 / p>
libfoo 中的所有后续BOOST_LOG_TRIVIAL(severity)
调用正在生成格式化输出,而 exefoo 中的每个类似调用都没有。
出于代码模块化的目的,我将这些函数移动到一个新的DLL liblog ,由 libfoo 和 exefoo 使用。现在,每个日志都不格式化。
似乎从DLL以某种方式加载此代码不会产生任何影响;我希望它能做到。