如何跨DLL边界使用Boost.Log?

TC。

我正在尝试将Boost.Log集成到一个较大的应用程序中,该应用程序由动态加载DLL插件的主应用程序组成。最初的想法是将日志记录源传递给插件,以便它们可以添加日志消息。但是,一旦来自DLL的代码尝试将消息记录到提供的源中,应用程序便会因访问冲突而崩溃。

方法1

下面的最小示例说明了该问题:

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一起编译)。

方法2

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边界执行日志记录?

TC。

我已经弄清楚了问题所在。Boost.Log文档指出:

如果您的应用程序包含多个使用Boost.Log的模块(例如,一个exe和一个或多个dll),则该库必须构建为共享对象。如果您具有与Boost.Log一起使用的单个可执行文件或单个模块,则可以将该库构建为静态库。

我使用Boost.Log作为静态库。通过共享链接构建增强功能,并在我的项目中使用它来解决该问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何跨DLL边界使用Boost.Log?

来自分类Dev

git log如何跨分支工作?

来自分类Dev

如何使boost :: log :: keywords :: file_name使用UTC时间?

来自分类Dev

boost :: log教程中的代码如何工作?

来自分类Dev

如何禁用Boost Log的自动刷新

来自分类Dev

boost.log和ostream如何配合?

来自分类Dev

在boost :: log中使用格式语法

来自分类Dev

使用 boost::log 配置文件变量

来自分类Dev

Boost Log清除日志文件

来自分类Dev

如何使用Log :: Log4perl记录时区?

来自分类Dev

可以在静态Boost构建中将Boost Log构建为.dll / .so吗?

来自分类Dev

使用Boost.Log时如何停止所有异步接收器

来自分类Dev

如何在自定义格式功能中使用Boost.Log格式表达式

来自分类Dev

如何使用自定义boost :: log格式化程序输出TimeStamp和ThreadID属性?

来自分类Dev

如何使用压缩机Boost :: Iostreams过滤器作为Boost :: Log中的接收器

来自分类Dev

忽略 git log 跨分支重复

来自分类Dev

如何设置boost.log以限制日志文件的数量

来自分类Dev

如何将OStream重定向到Boost Log库

来自分类Dev

在Boost.Log中正确使用异步_sink :: flush()

来自分类Dev

如何终止DLL中的log4cplus?

来自分类Dev

跨DLL边界的构造方法抛出异常

来自分类Dev

跨DLL边界的向量的内存重定位

来自分类Dev

如何使Log4j使用stdout?

来自分类Dev

如何使用git log --format =提取changeid?

来自分类Dev

ESLint&Vue-如何禁止使用$ log?

来自分类Dev

如何正确使用 Math.log?

来自分类Dev

如何使用 jGit 执行 git log -L?

来自分类Dev

如何使用 switch 和 console.log?

来自分类Dev

如何扩展console.log?