我正在使用Boost.Log,请登录boost 1.54.0以查看它对于我的应用程序是否可行。通常,缓冲没有问题,所以我不想打开auto_flush或其他任何东西...但是我注意到在调用之前记录的消息fork()
是重复的,我想知道是否是因为它们是缓冲的,所以在复制过程映像时,该缓冲区将被复制,然后两个进程最终将其缓冲副本写入日志文件...
因此,基本上,我只想在致电之前立即对日志进行一次手动刷新,fork()
以确保没有消息仍在内存中。换句话说,我正在寻找一个类似于fflush()
,.flush()
,<< flush
等我可以在升压日志使用。
我确实尝试过使用<< flush
日志,但是我仍然收到重复的消息,所以我不确定100%是否刷新它,并且重复是由其他问题引起的,还是它默默地忽略了<< flush
...
编辑:
我四处张望,发现升压日志不是安全的。因此,我应该补充一点,我没有尝试在父进程和子进程中使用相同的日志。我有两种派生方案-一种是父级立即终止,子级终止(这样应该是安全的),另一种是,子级应该打开自己的单独日志文件,这样也应该安全...但是我需要弄清楚如何关闭一个日志文件接收器,然后打开一个新的文件接收器(在另一个文件上)。我想关闭水槽可能也是强制冲洗的一种方法...?
好的...我不得不仔细研究一下提升代码(但不要太多),我发现了这一点,这似乎行得通:
当您调用add_file_log(strLogFilename)
它时,将返回您的接收器类型(例如)shared_ptr<sink>
在哪里。如果您改为“手动”创建接收器,则当然也有指向它的指针...似乎接收器和后端都有方法。我不确定如何直接获得后端的副本以调用其冲洗,但接收器上的冲洗似乎只是在其后端上调用冲洗,因此可以正常工作。这是一些我发现对我有用的示例代码:sink
shared_ptr< synchronous_sink< text_file_backend > >
.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!";
使用此方法,我现在每个日志消息仅看到一次。当然,请记住有关将Boost.Log与fork()混合的警告... http://boost-log.sourceforge.net/libs/log/doc/html/log/rationale/fork_support.html
在我的示例中,这仅是安全的,因为父进程在分叉后立即退出,而根本不接触日志(在分叉之后)。因此,日志没有任何争用。
尽管有限制,我可以在少数情况下使用此看到:1)daemonizing的过程(这是我想在这里做的,其实),2)叉EXEC模式(这确实与Boost.Log做工精细,根据上述网址),或3)子进程立即关闭文件接收器,并为指向不同文件(与父进程使用的文件不同)的日志打开一个新的接收器-我认为这第三种情况应该是安全的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句