用于高性能应用的多线程日志记录

时间:2010-10-13 08:33:03

标签: c++ multithreading logging

我有一个需要大量日志记录的应用程序(服务器应用程序),并且不应该通过启用日志记录来影响性能。

应用程序有一个执行工作的工作线程的线程池。本来我打算只登录这些线程池线程,但是我需要几乎锁定整个线程,所以我的'多线程'应用程序就是这样。

我一直在寻找更好的方法来记录多个线程,我发现使用队列或环形缓冲区可能是一个想法。

任何人都可以建议(可能来自经验)为多线程应用程序实现有效日志记录(主要是文件)的任何好方法,这些应用程序也应保持一定的性能吗?

我想使用Boost Logging Library。

6 个答案:

答案 0 :(得分:7)

据我所知,

Pantheios是C ++中最快的日志记录库。我建议使用它而不是Boost Logging。使用Pantheios,您只需登录到该文件,而您无需关心哪个线程。如果需要,您可以将线程名称放在日志行前缀中,并为您完成所有操作。

答案 1 :(得分:3)

就我个人而言,我会看看Pantheios,看了一眼,看起来很有趣,将在我未来的项目中加入。

如果你真的想使用boost记录,我会使用一个同步队列来处理所有内部锁定,这样你的工作人员就不用担心了。

伪代码:

 class SynchedQueue {
      void write(text) { lock() logfile.write(text) unlock() }

或者,如果您真的想要快速,请使用内部队列并一次从X行中的公共队列传输。公共队列不必等待可能需要相对长时间的文件i / o,并且私有队列很少只获取行。虽然它可能仍然比Pantheios慢。

答案 2 :(得分:2)

我最近在ddj上使用Active Objects读取了一篇有趣的文章:

http://www.drdobbs.com/high-performance-computing/227500074

较早的文章还讨论了线程安全日志记录的一些设计注意事项:

http://www.drdobbs.com/cpp/201804215

答案 3 :(得分:2)

Apache log4cxx。我已经看到很多地方被广泛使用。其中大多数是交易应用程序,多线程和低延迟应用程序。 log4cxx并不逊于任何日志库,它可用于C ++和Java(Apache log4j),我使用过这两个。

答案 4 :(得分:2)

我正在使用并且非常喜欢Petru Marginean's logging system。它非常轻快,整洁。我花了一点时间才能让我的头围绕它,所以我可以根据自己的喜好进行调整,但是一旦你理解了它,它就是一种美,因为整个库只有250行的1个头文件,它不是很多通过

最慢的部分是它使用带有ostringstream的对象,但我怀疑你会发现更快的东西。至少不是没有比C ++更多的C语言。

在他的second article and version中,他展示了他如何使其成为线程安全的。

如果你找不到源代码,请告诉我,我有。我记得我必须要搜索一下。

答案 5 :(得分:0)

我不熟悉Boost Logging库,所以我不能对此发表评论。

NLog支持从C / C ++和COM(以及托管.NET应用程序)进行日志记录。不确定它是否具有您追求的性能特征。

您可能还会考虑ETW。它是Windows内核中实现的高速日志记录系统。我没有使用它,但微软确实似乎更多地推动它,并使每个版本更容易使用它。它们肯定使托管代码更容易使用。就目前而言,我认为设置然后获得输出有点复杂。我从未认真考虑过我已经认真考虑过实施ETW,所以我无法评论它究竟是多么容易或多么困难。