如何手动刷新提升日志?

戴夫·里尔顿(Dave Lillethun)

我正在使用Boost.Log,请登录boost 1.54.0以查看它对于我的应用程序是否可行。通常,缓冲没有问题,所以我不想打开auto_flush或其他任何东西...但是我注意到在调用之前记录的消息fork()是重复的,我想知道是否是因为它们是缓冲的,所以在复制过程映像时,该缓冲区将被复制,然后两个进程最终将其缓冲副本写入日志文件...

因此,基本上,我只想在致电之前立即对日志进行一次手动刷新,fork()以确保没有消息仍在内存中。换句话说,我正在寻找一个类似于fflush().flush()<< flush等我可以在升压日志使用。

我确实尝试过使用<< flush日志,但是我仍然收到重复的消息,所以我不确定100%是否刷新它,并且重复是由其他问题引起的,还是它默默地忽略了<< flush...

编辑:

我四处张望,发现升压日志不是安全的。因此,我应该补充一点,我没有尝试在父进程和子进程中使用相同的日志。我有两种派生方案-一种是父级立即终止,子级终止(这样应该是安全的),另一种是,子级应该打开自己的单独日志文件,这样也应该安全...但是我需要弄清楚如何关闭一个日志文件接收器,然后打开一个新的文件接收器(在另一个文件上)。我想关闭水槽可能也是强制冲洗的一种方法...?

戴夫·里尔顿(Dave Lillethun)

好的...我不得不仔细研究一下提升代码(但不要太多),我发现了这一点,这似乎行得通:

当您调用add_file_log(strLogFilename)它时,将返回您的接收器类型(例如shared_ptr<sink>在哪里如果您改为“手动”创建接收器,则当然也有指向它的指针...似乎接收器和后端都有方法。我不确定如何直接获得后端的副本以调用其冲洗,但接收器上的冲洗似乎只是在其后端上调用冲洗,因此可以正常工作。这是一些我发现对我有用的示例代码:sinkshared_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何自动刷新日志,而不是手动刷新

来自分类Dev

如何在手动刷新时注销用户

来自分类Dev

如何手动发送Django异常日志?

来自分类Dev

如何手动旋转log4j日志

来自分类Dev

如何手动填充?

来自分类Dev

Redis-提升从属手动为主

来自分类Dev

Ember如何在手动刷新页面时保留查询参数?

来自分类Dev

手动删除某些项目后如何刷新引导程序缩略图

来自分类Dev

如何在Xaml(Windows 8应用)中手动更新/刷新ListView?

来自分类Dev

Ember如何在手动刷新页面时保留查询参数?

来自分类Dev

如何手动将示例日志消息通过管道传递到logstash以进行处理

来自分类Dev

手动刷新页面时如何取消浏览器关闭/刷新确认模式?

来自分类Dev

从Snowflake中的表流中手动刷新数据

来自分类Dev

Blazor Server:手动刷新重新呈现的UI

来自分类Dev

从Snowflake中的表流中手动刷新数据

来自分类Dev

手动刷新时AngularJS路线中断

来自分类Dev

手动刷新后未引用ScriptResource.axd

来自分类Dev

使用 CocoaLumberjack 手动创建新的日志文件

来自分类Dev

NLog UWP 手动删除/导出日志

来自分类Dev

如何手动卸载Magento插件?

来自分类Dev

如何手动安装自制软件

来自分类Dev

如何手动验证SAMLResponse签名?

来自分类Dev

NHibernate如何手动添加扩展?

来自分类Dev

如何手动安装Zurb Foundation?

来自分类Dev

如何手动重新渲染组件?

来自分类Dev

如何手动触发更改事件?

来自分类Dev

如何手动创建Mipmap?

来自分类Dev

如何手动触发弹簧验证?

来自分类Dev

如何手动触发事件