【问题标题】:boost::log format doesn't work when called from DLL从 DLL 调用时 boost::log 格式不起作用
【发布时间】: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 的主要暴露对象中,我在 exefoomain() 中调用了 -once- add_boost_log_console_sink(); 相同的调用。

每个后续的 BOOST_LOG_TRIVIAL(severity) 调用 inside libfoo 都会生成格式化输出,而 exefoo 内部的每个类似调用都不会。

出于代码模块化的目的,我将这些函数移入了一个新的 DLL,liblog,供 libfooexefoo 使用。现在每个日志都没有格式化。

似乎以某种方式从 DLL 加载此代码不会产生任何效果;我希望它会这样做。

【问题讨论】:

  • 您是否与 Boost.Log 动态链接(即 dll)?你定义BOOST_LOG_DYN_LINK还是BOOST_ALL_DYN_LINK
  • 我没有,我正在静态链接 libboost_log-vc140-mt-1_60.lib。但是 libloglibfoo 是 dll。也许我应该至少将 liblog 更改为静态库。
  • 这就是问题的根源。如果从不同的模块中使用,Boost.Log 需要构建为共享库。 boost.org/doc/libs/1_62_0/libs/log/doc/html/log/installation/…

标签: c++ logging boost dll boost-log


【解决方案1】:

作为Andrey Semashev 提供的见解,我将liblog 配置类型从动态库切换为静态库。现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多