4

我对 Boost.Log 库有点陌生,第一印象非常好,但有一件事已经花费了很多时间,我无法解决。我想让 Boost.Log 立即将每条消息写入日志文件。我知道其他问题(IIIIII),但是它们没有帮助。考虑来自 boost docs 的这个例子,下一个代码是相同的,除了我设置auto_flushtrue

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;

void init()
{
    // Construct the sink
    typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;
    boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();

    // Add a stream to write log to
    sink->locked_backend()->add_stream(
        boost::make_shared< std::ofstream >("sample.log")); //1

    sink->locked_backend()->auto_flush(true);

    // Register the sink in the logging core
    logging::core::get()->add_sink(sink);
}

int main(int, char*[])
{
    init();

    src::logger lg;
    BOOST_LOG(lg) << "Hello world!";

    return 0;
}

在调试时,sample.log执行第一个命令(//1)后会创建一个空,但是在执行 BOOST_LOG 后,日志文件仍然是空的,只有在return语句之后,Hello world!才会将其写入日志文件。

感谢帮助!

4

1 回答 1

5

我做了一些研究。考虑下一个更改的main功能:

int main(int, char*[])
{
    init();

    src::logger lg;
    BOOST_LOG(lg) << "Hello world #1!";
    BOOST_LOG(lg) << "Hello world #2!";
    std::cin.get();
    BOOST_LOG(lg) << "Hello world #3!";
    BOOST_LOG(lg) << "Hello world #4!";

    return 0;
}

所以std::cin.get()作为暂停,在正常模式下启动应用程序(不调试,从 VS2008 Ctrl + F5,或者只是*.exeDebug文件夹执行),当你到达输入部分(std::cin.get())时,只需转到任务管理器并终止进程。根据auto_flush结果​​的值,接下来是:

  • auto_flush(false)-- 日志文件为空!
  • auto_flush(true)-- 日志文件将包含前两条记录,之前创建std::cin.get()

更改std::cin.get()throw 1总是将前两条记录写入日志文件,关于是否auto_flush设置为truefalse两者都在ReleaseDebug构建中。

所以,结论是auto_flush工作正常,只是在直接从 Visual Studio 调试时有点奇怪。

于 2013-11-27T07:55:16.210 回答