Boost.Log在每个日志记录语句之后刷新

Boost.Log flush after each logging statement

本文关键字:记录 语句 之后 刷新 日志 Log Boost      更新时间:2023-10-16

我对Boost.Log库有点陌生,第一印象真的很好,但有一件事已经花了很多小时,我无法解决。我想制作Boost.Llog,立即将每条消息写入日志文件。我知道其他问题(I、II、III),但它们没有帮助。考虑boost文档中的这个例子,下一个代码是相同的,只是我已经将auto_flush设置为true:

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;
}

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

谢谢你的帮助!

我做了一些研究。考虑下一个更改的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,或简单地从Debug文件夹中执行*.exe),当您到达输入部分(std::cin.get())时,只需转到任务管理器并终止进程。根据auto_flush的值,结果如下:

  • auto_flush(false)-日志文件为空
  • auto_flush(true)—日志文件将包含在std::cin.get()之前生成的前两条记录

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

因此,结论是auto_flush运行良好,只是在直接从Visual Studio进行调试时有一点奇怪的行为。