C++ 如何手动刷新boost日志?

C++ 如何手动刷新boost日志?,c++,boost,flush,boost-log,boost-logging,C++,Boost,Flush,Boost Log,Boost Logging,我正在玩Boost。登录Boost 1.54.0,看看它是否适合我的应用程序。一般来说,我在缓冲方面并没有问题,所以我不想打开自动刷新或任何东西。。。但是我注意到在调用fork()之前记录的消息是重复的,我想知道这是否是因为它们被缓冲了,当复制进程映像时缓冲区会重复,然后两个进程最终都会将缓冲区副本写入日志文件 所以基本上,我只想在调用fork()之前,在日志上手动刷新一次,以确保内存中没有消息。换句话说,我在寻找类似于fflush(),.flush(),的东西。。。我不得不仔细研究一下boos

我正在玩Boost。登录Boost 1.54.0,看看它是否适合我的应用程序。一般来说,我在缓冲方面并没有问题,所以我不想打开自动刷新或任何东西。。。但是我注意到在调用
fork()
之前记录的消息是重复的,我想知道这是否是因为它们被缓冲了,当复制进程映像时缓冲区会重复,然后两个进程最终都会将缓冲区副本写入日志文件


所以基本上,我只想在调用
fork()
之前,在日志上手动刷新一次,以确保内存中没有消息。换句话说,我在寻找类似于
fflush()
.flush()
的东西。。。我不得不仔细研究一下boost代码(但不是太多),我发现这似乎是可行的:

调用
add_file_log(strLogFilename)
时,它返回一个
shared_ptr
,其中
sink
是您的接收器类型(例如,
shared_ptr
)。如果你改为“手动”创建你的接收器,那么当然你也有一个指向它的指针。。。看起来接收器和后端都有一个
.flush()
方法。我不确定如何直接获取后端的副本来调用其刷新,但接收器上的刷新似乎只是调用其后端上的刷新,因此可以工作。下面是一些我发现对我有用的示例代码:

shared_ptr< synchronous_sink< text_file_backend > > pLogSink = add_file_log(strLogFilaname);
BOOST_LOG_TRIVIAL(debug) << "Boost log!";

// other work goes here

BOOST_LOG_TRIVIAL(debug) << "About to fork...";
if (pLogSink)
  pLogSink->flush();
pid_t pid = fork();

if (pid < 0)
  // handle error
else if (pid > 0)
  exit(EXIT_SUCCESS); // parent terminates
assert(0 == pid); // child continues

BOOST_LOG_TRIVIAL(debug) << "Fork succeeded!";
shared\u ptr>pLogSink=add\u file\u log(strLogFilaname);
BOOST_LOG_平凡(调试)0)
退出(退出成功);//父母终止
断言(0==pid);//孩子继续
BOOST_LOG_triple(debug)甚至更简单的代码(使用triple日志记录):

#包括
#包括
#包括
#包括
#包括
名称空间日志=boost::log;
void InitLogging(){
boost::filesystem::path full_path(boost::filesystem::current_path());
自动接收=记录::添加文件日志(“sample.log”);

BOOST_LOG_Little(信息)也许您可以添加一个您收听的日志频道,然后记录一条消息。一旦您在频道中接收到该消息,您可以删除该频道,然后准备分叉。
#include <boost/filesystem.hpp>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>

namespace logging = boost::log;

void InitLogging() {
  boost::filesystem::path full_path(boost::filesystem::current_path());

  auto sink = logging::add_file_log("sample.log");
  BOOST_LOG_TRIVIAL(info) << "Log initialized.";
  BOOST_LOG_TRIVIAL(info) << "Working dir: " << full_path;
  sink->flush();
}

int main() {
  InitLogging();
  return 0;
}