从DLL

时间:2016-11-29 16:22:33

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

我曾经在我的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以某种方式加载此代码不会产生任何影响;我希望它能做到。

1 个答案:

答案 0 :(得分:0)

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