C++中的异步线程安全日志记录

Ele*_*tro 17 c++ logging asynchronous thread-safety

我正在寻找一种在我的C++项目中进行异步和线程安全日志记录的方法,如果可能的话,可以在一个文件中.我目前正在使用cerrclog执行任务,但由于它们是同步的,因此每次记录某些内容时执行都会暂停.这是一个相对图形密集的应用程序,所以这种事情非常烦人.

新的记录器应该使用异步I/O来摆脱这些暂停.线程安全也是可取的,因为我打算很快添加一些基本的多线程.

我认为每个线程一个文件的方法,但这似乎会使管理日志成为一场噩梦.有什么建议?

Kje*_*röm 20

我注意到这个1年+旧线程.也许我写的异步记录器可能很有意思.

http://www.codeproject.com/KB/library/g2log.aspx

G2log使用受保护的消息队列将日志条目转发给慢速磁盘访问的后台工作程序.

我尝试使用无锁队列,这增加了LOG调用的平均时间,但减少了最坏的情况,但是我现在使用的是受保护的队列,因为它是跨平台的.它在Windows/Visual Studio 2010和Ubuntu 11.10/gcc4.6上进行了测试.

它是作为公共领域发布的,所以你可以用它来做你想要的,没有任何附加条件.


Ama*_*9MF 4

这是非常可能和实用的。我怎么知道?我在上一份工作中正是这样写的。不幸的是(对我们来说),他们现在拥有代码。:-) 可悲的是,他们甚至不使用它。

我打算在不久的将来编写一个开源版本。同时,我可以给你一些提示。

  1. I/O 操纵器实际上只是函数名称。您可以为自己的日志记录类实现它们,以便您的记录器与 cout/cin 兼容。
  2. 您的操纵器函数可以对操作进行标记并将它们存储到队列中。
  3. 线程可以被阻塞在该队列上,等待日志块飞过。然后它处理字符串操作并生成实际日志。

这本质上是线程兼容的,因为您使用的是队列。但是,您仍然希望在写入队列时设置一些类似互斥锁的保护,以便给定的 log << "stuff" << "more stuff"; 类型操作仍然是行原子的。

玩得开心!