我正在尝试将Boost.Log集成到一个较大的应用程序中,该应用程序由动态加载DLL插件的主应用程序组成。最初的想法是将日志记录源传递给插件,以便它们可以添加日志消息。但是,一旦来自DLL的代码尝试将消息记录到提供的源中,应用程序便会因访问冲突而崩溃。
下面的最小示例说明了该问题:
int main(int argc, char* argv[])
{
boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> logger;
// This is okay
BOOST_LOG_SEV(logger, boost::log::trivial::info) << "From main()";
// This crashes
logFromDll(logger);
return 0;
}
在logFromDll
单独的(DLL)项目中定义的位置:
平板电脑
TESTDLL_API void logFromDll(boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> &logger)
{
BOOST_LOG_SEV(logger, boost::log::trivial::info) << "From dll";
}
如上所述,这会因访问冲突而崩溃logFromDll
(与Visual Studio 2010一起编译)。
Boost.Log提供了一种用于“全局存储”日志记录源的机制:
声明了全局记录器之后,可以肯定的是可以从应用程序代码的任何位置对该记录器实例进行线程安全访问。该库还保证即使在模块边界上,全局记录器实例也将是唯一的。
听起来完全符合我的需求。因此,我设置了以下示例:
记录器
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>)
Main.cpp
int main(int argc, char* argv[])
{
boost::log::add_console_log
(
std::clog,
boost::log::keywords::format =
(
boost::log::expressions::stream << "[Custom format] " << boost::log::expressions::smessage
)
);
BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::info) << "From main()";
logFromDll();
return 0;
}
平板电脑
TESTDLL_API void logFromDll()
{
BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::info) << "From dll";
}
这不会崩溃,但是会产生以下输出:
[Custom format] From main()
[2014-06-19 10:22:28.435366] [0x00000233] [info] From dll
也就是说,仅当我从主项目登录时,才会应用在main.cpp中设置的自定义格式。来自DLL项目的所有日志记录均使用默认格式进行格式化。
因此,如何以正确应用在主项目中设置的所有(格式化)选项的方式跨DLL边界执行日志记录?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句